diff options
1161 files changed, 20055 insertions, 17515 deletions
@@ -34,6 +34,8 @@ per-file TestProtoLibraries.bp = file:platform/tools/tradefederation:/OWNERS per-file *ravenwood* = file:ravenwood/OWNERS per-file *Ravenwood* = file:ravenwood/OWNERS +per-file PREUPLOAD.cfg = file:/PREUPLOAD_OWNERS + per-file INPUT_OWNERS = file:/INPUT_OWNERS per-file ZYGOTE_OWNERS = file:/ZYGOTE_OWNERS per-file SQLITE_OWNERS = file:/SQLITE_OWNERS @@ -48,3 +50,4 @@ per-file BROADCASTS_OWNERS = file:/BROADCASTS_OWNERS per-file ADPF_OWNERS = file:/ADPF_OWNERS per-file GAME_MANAGER_OWNERS = file:/GAME_MANAGER_OWNERS per-file SDK_OWNERS = file:/SDK_OWNERS +per-file PREUPLOAD_OWNERS = file:/PREUPLOAD_OWNERS diff --git a/PREUPLOAD_OWNERS b/PREUPLOAD_OWNERS new file mode 100644 index 000000000000..ece4d3e5e268 --- /dev/null +++ b/PREUPLOAD_OWNERS @@ -0,0 +1,2 @@ +roosa@google.com +gsennton@google.com diff --git a/apct-tests/perftests/core/src/android/content/pm/SystemFeaturesMetadataPerfTest.java b/apct-tests/perftests/core/src/android/content/pm/SystemFeaturesMetadataPerfTest.java new file mode 100644 index 000000000000..205c7b875bbc --- /dev/null +++ b/apct-tests/perftests/core/src/android/content/pm/SystemFeaturesMetadataPerfTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; + +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class SystemFeaturesMetadataPerfTest { + // As each query is relatively cheap, add an inner iteration loop to reduce execution noise. + private static final int NUM_ITERATIONS = 10; + + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Test + public void maybeGetSdkFeatureIndex_featureDefined() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < NUM_ITERATIONS; ++i) { + PackageManager.maybeGetSdkFeatureIndex(PackageManager.FEATURE_WATCH); + PackageManager.maybeGetSdkFeatureIndex(PackageManager.FEATURE_LEANBACK); + PackageManager.maybeGetSdkFeatureIndex(PackageManager.FEATURE_IPSEC_TUNNELS); + PackageManager.maybeGetSdkFeatureIndex(PackageManager.FEATURE_WEBVIEW); + PackageManager.maybeGetSdkFeatureIndex(PackageManager.FEATURE_NFC_BEAM); + PackageManager.maybeGetSdkFeatureIndex(PackageManager.FEATURE_AUTOFILL); + } + } + } + + @Test + public void maybeGetSdkFeatureIndex_featureUndefined() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < NUM_ITERATIONS; ++i) { + PackageManager.maybeGetSdkFeatureIndex("com.android.custom.feature.1"); + PackageManager.maybeGetSdkFeatureIndex("com.android.custom.feature.2"); + PackageManager.maybeGetSdkFeatureIndex("foo"); + PackageManager.maybeGetSdkFeatureIndex("bar"); + PackageManager.maybeGetSdkFeatureIndex("0"); + PackageManager.maybeGetSdkFeatureIndex(""); + } + } + } + +} diff --git a/apct-tests/perftests/core/src/android/libcore/ZipFilePerfTest.java b/apct-tests/perftests/core/src/android/libcore/ZipFilePerfTest.java index ed669beae1ce..c77528021201 100644 --- a/apct-tests/perftests/core/src/android/libcore/ZipFilePerfTest.java +++ b/apct-tests/perftests/core/src/android/libcore/ZipFilePerfTest.java @@ -63,14 +63,12 @@ public class ZipFilePerfTest { @Test @Parameters(method = "getData") - public void timeZipFileOpen(int numEntries) throws Exception { + public void timeZipFileOpenClose(int numEntries) throws Exception { setUp(numEntries); BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { ZipFile zf = new ZipFile(mFile); - state.pauseTiming(); zf.close(); - state.resumeTiming(); } } diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java b/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java index 73bff08c626d..af0237491639 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java @@ -20,6 +20,7 @@ import android.app.Activity; import android.app.Instrumentation; import android.os.Bundle; import android.os.Debug; +import android.os.Trace; import android.util.Log; import androidx.test.InstrumentationRegistry; @@ -129,17 +130,23 @@ public final class BenchmarkState { } private void beginWarmup() { + Trace.beginSection("Warmup"); mStartTimeNs = System.nanoTime(); mIteration = 0; mState = WARMUP; } + private void endWarmup() { + Trace.endSection(); + } + private void beginBenchmark(long warmupDuration, int iterations) { if (ENABLE_PROFILING) { File f = new File(InstrumentationRegistry.getContext().getDataDir(), "benchprof"); Log.d(TAG, "Tracing to: " + f.getAbsolutePath()); Debug.startMethodTracingSampling(f.getAbsolutePath(), 16 * 1024 * 1024, 100); } + Trace.beginSection("Benchmark"); mMaxIterations = (int) (TARGET_TEST_DURATION_NS / (warmupDuration / iterations)); mMaxIterations = Math.min(MAX_TEST_ITERATIONS, Math.max(mMaxIterations, MIN_TEST_ITERATIONS)); @@ -150,6 +157,10 @@ public final class BenchmarkState { mStartTimeNs = System.nanoTime(); } + private void endBenchmark() { + Trace.endSection(); + } + private boolean startNextTestRun() { final long currentTime = System.nanoTime(); mResults.add((currentTime - mStartTimeNs - mPausedDurationNs) / mMaxIterations); @@ -165,6 +176,7 @@ public final class BenchmarkState { return true; } mState = FINISHED; + endBenchmark(); return false; } mPausedDurationNs = 0; @@ -189,6 +201,7 @@ public final class BenchmarkState { // don't yet have a target iteration count. final long duration = System.nanoTime() - mStartTimeNs; if (mIteration >= WARMUP_MIN_ITERATIONS && duration >= WARMUP_DURATION_NS) { + endWarmup(); beginBenchmark(duration, mIteration); } return true; @@ -208,6 +221,7 @@ public final class BenchmarkState { mCustomizedIterations++; if (mCustomizedIterations >= mMaxCustomizedIterations) { mState = FINISHED; + endBenchmark(); return false; } mCustomizedIterationListener.onStart(mCustomizedIterations); diff --git a/apex/jobscheduler/service/aconfig/job.aconfig b/apex/jobscheduler/service/aconfig/job.aconfig index fe95a59622f4..86ed06bf4e3d 100644 --- a/apex/jobscheduler/service/aconfig/job.aconfig +++ b/apex/jobscheduler/service/aconfig/job.aconfig @@ -95,4 +95,14 @@ flag { namespace: "backstage_power" description: "Apply the quota policy to jobs started when the app was in TOP state" bug: "374323858" +} + +flag { + name: "enforce_schedule_limit_to_proxy_jobs" + namespace: "backstage_power" + description: "Limit the schedule calls towards the persisted proxy jobs" + bug: "377912323" + metadata { + purpose: PURPOSE_BUGFIX + } }
\ No newline at end of file diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 8fad79a845b4..0b884057ea19 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -1718,8 +1718,9 @@ public class JobSchedulerService extends com.android.server.SystemService int userId, @Nullable String namespace, String tag) { // Rate limit excessive schedule() calls. final String servicePkg = job.getService().getPackageName(); - if (job.isPersisted() && (packageName == null || packageName.equals(servicePkg))) { - // Only limit schedule calls for persisted jobs scheduled by the app itself. + if (job.isPersisted() && (Flags.enforceScheduleLimitToProxyJobs() + || (packageName == null || packageName.equals(servicePkg)))) { + // limit excessive schedule calls for persisted jobs. final String pkg = packageName == null ? servicePkg : packageName; if (!mQuotaTracker.isWithinQuota(userId, pkg, QUOTA_TRACKER_SCHEDULE_PERSISTED_TAG)) { if (mQuotaTracker.isWithinQuota(userId, pkg, QUOTA_TRACKER_SCHEDULE_LOGGED)) { diff --git a/api/ApiDocs.bp b/api/ApiDocs.bp index 89351fd47ff8..03fb44fd8145 100644 --- a/api/ApiDocs.bp +++ b/api/ApiDocs.bp @@ -130,6 +130,10 @@ droidstubs { droidstubs { name: "framework-doc-stubs", defaults: ["android-non-updatable-doc-stubs-defaults"], + flags: [ + // Ignore any compatibility errors, see check_api.last_released below for more information. + "--hide-category Compatibility", + ], srcs: [":all-modules-public-stubs-source-exportable"], api_levels_module: "api_versions_public", aidl: { @@ -138,13 +142,39 @@ droidstubs { "packages/modules/Media/apex/aidl/stable", ], }, + + // Pass the previously released API to support reverting flagged APIs. Without this, reverting + // a flagged API will cause it to be removed, even if it had previously been released. This + // has the side effect of causing compatibility issues to be reported but they are already + // checked elsewhere so they will be ignored, see `--hide-category Compatibility` above. + check_api: { + last_released: { + api_file: ":android.api.combined.public.latest", + removed_api_file: ":android-removed.api.combined.public.latest", + }, + }, } droidstubs { name: "framework-doc-system-stubs", defaults: ["framework-doc-stubs-sources-default"], - flags: ["--show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS\\)"], + flags: [ + "--show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS\\)", + // Ignore any compatibility errors, see check_api.last_released below for more information. + "--hide-category Compatibility", + ], api_levels_module: "api_versions_system", + + // Pass the previously released API to support reverting flagged APIs. Without this, reverting + // a flagged API will cause it to be removed, even if it had previously been released. This + // has the side effect of causing compatibility issues to be reported but they are already + // checked elsewhere so they will be ignored, see `--hide-category Compatibility` above. + check_api: { + last_released: { + api_file: ":android.api.combined.system.latest", + removed_api_file: ":android-removed.api.combined.system.latest", + }, + }, } ///////////////////////////////////////////////////////////////////// diff --git a/boot/preloaded-classes b/boot/preloaded-classes index a696e03d5bdf..afd9984cb124 100644 --- a/boot/preloaded-classes +++ b/boot/preloaded-classes @@ -6469,6 +6469,7 @@ android.os.connectivity.WifiActivityEnergyInfo$1 android.os.connectivity.WifiActivityEnergyInfo android.os.connectivity.WifiBatteryStats$1 android.os.connectivity.WifiBatteryStats +android.os.flagging.AconfigPackage android.os.health.HealthKeys$Constant android.os.health.HealthKeys$Constants android.os.health.HealthKeys$SortedIntArray diff --git a/config/preloaded-classes b/config/preloaded-classes index ed402767ee64..343de0bf3b98 100644 --- a/config/preloaded-classes +++ b/config/preloaded-classes @@ -6473,6 +6473,7 @@ android.os.connectivity.WifiActivityEnergyInfo$1 android.os.connectivity.WifiActivityEnergyInfo android.os.connectivity.WifiBatteryStats$1 android.os.connectivity.WifiBatteryStats +android.os.flagging.AconfigPackage android.os.health.HealthKeys$Constant android.os.health.HealthKeys$Constants android.os.health.HealthKeys$SortedIntArray diff --git a/core/api/current.txt b/core/api/current.txt index bbdcd6de9cb0..f9e772649e43 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -280,6 +280,7 @@ package android { field public static final String REQUEST_COMPANION_PROFILE_COMPUTER = "android.permission.REQUEST_COMPANION_PROFILE_COMPUTER"; field public static final String REQUEST_COMPANION_PROFILE_GLASSES = "android.permission.REQUEST_COMPANION_PROFILE_GLASSES"; field public static final String REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING = "android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING"; + field @FlaggedApi("android.companion.virtualdevice.flags.enable_limited_vdm_role") public static final String REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING = "android.permission.REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING"; field public static final String REQUEST_COMPANION_PROFILE_WATCH = "android.permission.REQUEST_COMPANION_PROFILE_WATCH"; field public static final String REQUEST_COMPANION_RUN_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND"; field public static final String REQUEST_COMPANION_SELF_MANAGED = "android.permission.REQUEST_COMPANION_SELF_MANAGED"; @@ -1505,7 +1506,6 @@ package android { field public static final int shadowRadius = 16843108; // 0x1010164 field public static final int shape = 16843162; // 0x101019a field public static final int shareInterpolator = 16843195; // 0x10101bb - field @FlaggedApi("android.nfc.nfc_associated_role_services") public static final int shareRolePriority; field @Deprecated public static final int sharedUserId = 16842763; // 0x101000b field @Deprecated public static final int sharedUserLabel = 16843361; // 0x1010261 field public static final int sharedUserMaxSdkVersion = 16844365; // 0x101064d @@ -1870,6 +1870,7 @@ package android { field public static final int wallpaperIntraOpenExitAnimation = 16843416; // 0x1010298 field public static final int wallpaperOpenEnterAnimation = 16843411; // 0x1010293 field public static final int wallpaperOpenExitAnimation = 16843412; // 0x1010294 + field @FlaggedApi("android.nfc.nfc_associated_role_services") public static final int wantsRoleHolderPriority; field public static final int webTextViewStyle = 16843449; // 0x10102b9 field public static final int webViewStyle = 16842885; // 0x1010085 field public static final int weekDayTextAppearance = 16843592; // 0x1010348 @@ -10065,6 +10066,7 @@ package android.companion { field @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_COMPUTER) public static final String DEVICE_PROFILE_COMPUTER = "android.app.role.COMPANION_DEVICE_COMPUTER"; field @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_GLASSES) public static final String DEVICE_PROFILE_GLASSES = "android.app.role.COMPANION_DEVICE_GLASSES"; field @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING) public static final String DEVICE_PROFILE_NEARBY_DEVICE_STREAMING = "android.app.role.COMPANION_DEVICE_NEARBY_DEVICE_STREAMING"; + field @FlaggedApi("android.companion.virtualdevice.flags.enable_limited_vdm_role") @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING) public static final String DEVICE_PROFILE_SENSOR_DEVICE_STREAMING = "android.app.role.COMPANION_DEVICE_SENSOR_DEVICE_STREAMING"; field public static final String DEVICE_PROFILE_WATCH = "android.app.role.COMPANION_DEVICE_WATCH"; } @@ -13380,6 +13382,7 @@ package android.content.pm { method @NonNull public abstract android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(@NonNull android.graphics.drawable.Drawable, @NonNull android.os.UserHandle, @Nullable android.graphics.Rect, int); method @NonNull public abstract android.graphics.drawable.Drawable getUserBadgedIcon(@NonNull android.graphics.drawable.Drawable, @NonNull android.os.UserHandle); method @NonNull public abstract CharSequence getUserBadgedLabel(@NonNull CharSequence, @NonNull android.os.UserHandle); + method @FlaggedApi("android.content.pm.cloud_compilation_pm") @NonNull public static android.content.pm.SigningInfo getVerifiedSigningInfo(@NonNull String, int) throws android.content.pm.SigningInfoException; method @NonNull @RequiresPermission(value="android.permission.WHITELIST_RESTRICTED_PERMISSIONS", conditional=true) public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions(@NonNull String, int); method @Nullable public abstract android.content.res.XmlResourceParser getXml(@NonNull String, @XmlRes int, @Nullable android.content.pm.ApplicationInfo); method public boolean hasSigningCertificate(@NonNull String, @NonNull byte[], int); @@ -14025,8 +14028,17 @@ package android.content.pm { method public android.content.pm.Signature[] getSigningCertificateHistory(); method public boolean hasMultipleSigners(); method public boolean hasPastSigningCertificates(); + method @FlaggedApi("android.content.pm.cloud_compilation_pm") public boolean signersMatchExactly(@NonNull android.content.pm.SigningInfo); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.SigningInfo> CREATOR; + field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_JAR = 1; // 0x1 + field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_SIGNING_BLOCK_V2 = 2; // 0x2 + field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_SIGNING_BLOCK_V3 = 3; // 0x3 + field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_SIGNING_BLOCK_V4 = 4; // 0x4 + } + + @FlaggedApi("android.content.pm.cloud_compilation_pm") public class SigningInfoException extends java.lang.Exception { + method @FlaggedApi("android.content.pm.cloud_compilation_pm") public int getCode(); } public final class VersionedPackage implements android.os.Parcelable { @@ -29956,7 +29968,7 @@ package android.net.http { public class X509TrustManagerExtensions { ctor public X509TrustManagerExtensions(javax.net.ssl.X509TrustManager) throws java.lang.IllegalArgumentException; method public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(java.security.cert.X509Certificate[], String, String) throws java.security.cert.CertificateException; - method @FlaggedApi("android.net.platform.flags.x509_extensions_certificate_transparency") @NonNull public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(@NonNull java.security.cert.X509Certificate[], @Nullable byte[], @Nullable byte[], @NonNull String, @NonNull String) throws java.security.cert.CertificateException; + method @FlaggedApi("android.security.certificate_transparency_configuration") @NonNull public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(@NonNull java.security.cert.X509Certificate[], @Nullable byte[], @Nullable byte[], @NonNull String, @NonNull String) throws java.security.cert.CertificateException; method public boolean isSameTrustConfiguration(String, String); method public boolean isUserAddedCertificate(java.security.cert.X509Certificate); } @@ -34768,7 +34780,7 @@ package android.os { method @FlaggedApi("android.os.message_queue_testability") public boolean isBlockedOnSyncBarrier(); method public android.os.Message next(); method @FlaggedApi("android.os.message_queue_testability") @Nullable public Long peekWhen(); - method @FlaggedApi("android.os.message_queue_testability") @Nullable public android.os.Message pop(); + method @FlaggedApi("android.os.message_queue_testability") @Nullable public android.os.Message poll(); method public void recycle(android.os.Message); method public void release(); } @@ -45059,6 +45071,7 @@ package android.telephony { field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT = "satellite_entitlement_status_refresh_days_int"; field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL = "satellite_entitlement_supported_bool"; field @FlaggedApi("com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn") public static final String KEY_SATELLITE_ESOS_SUPPORTED_BOOL = "satellite_esos_supported_bool"; + field @FlaggedApi("com.android.internal.telephony.flags.satellite_25q4_apis") public static final String KEY_SATELLITE_IGNORE_DATA_ROAMING_SETTING_BOOL = "satellite_ignore_data_roaming_setting_bool"; field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final String KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING = "satellite_information_redirect_url_string"; field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final String KEY_SATELLITE_NIDD_APN_NAME_STRING = "satellite_nidd_apn_name_string"; field @FlaggedApi("com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn") public static final String KEY_SATELLITE_ROAMING_ESOS_INACTIVITY_TIMEOUT_SEC_INT = "satellite_roaming_esos_inactivity_timeout_sec_int"; @@ -47463,7 +47476,6 @@ package android.telephony { field public static final long NETWORK_TYPE_BITMASK_IWLAN = 131072L; // 0x20000L field public static final long NETWORK_TYPE_BITMASK_LTE = 4096L; // 0x1000L field @Deprecated public static final long NETWORK_TYPE_BITMASK_LTE_CA = 262144L; // 0x40000L - field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final long NETWORK_TYPE_BITMASK_NB_IOT_NTN = 1048576L; // 0x100000L field public static final long NETWORK_TYPE_BITMASK_NR = 524288L; // 0x80000L field public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = 65536L; // 0x10000L field public static final long NETWORK_TYPE_BITMASK_UMTS = 4L; // 0x4L @@ -47483,7 +47495,6 @@ package android.telephony { field @Deprecated public static final int NETWORK_TYPE_IDEN = 11; // 0xb field public static final int NETWORK_TYPE_IWLAN = 18; // 0x12 field public static final int NETWORK_TYPE_LTE = 13; // 0xd - field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final int NETWORK_TYPE_NB_IOT_NTN = 21; // 0x15 field public static final int NETWORK_TYPE_NR = 20; // 0x14 field public static final int NETWORK_TYPE_TD_SCDMA = 17; // 0x11 field public static final int NETWORK_TYPE_UMTS = 3; // 0x3 @@ -49356,7 +49367,7 @@ package android.text { method public static void dumpSpans(CharSequence, android.util.Printer, String); method public static CharSequence ellipsize(CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt); method public static CharSequence ellipsize(CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt, boolean, @Nullable android.text.TextUtils.EllipsizeCallback); - method public static boolean equals(CharSequence, CharSequence); + method public static boolean equals(@Nullable CharSequence, @Nullable CharSequence); method public static CharSequence expandTemplate(CharSequence, java.lang.CharSequence...); method public static int getCapsMode(CharSequence, int, int); method public static void getChars(CharSequence, int, int, char[], int); diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index bca2ce2473c5..40069aa00106 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -130,7 +130,6 @@ package android.content.pm { public abstract class PackageManager { method @NonNull public String getSdkSandboxPackageName(); - method @FlaggedApi("android.content.pm.cloud_compilation_pm") @NonNull public static android.content.pm.SigningInfo getVerifiedSigningInfo(@NonNull String, int) throws android.content.pm.SigningInfoException; method @RequiresPermission(android.Manifest.permission.MAKE_UID_VISIBLE) public void makeUidVisible(int, int); field public static final String EXTRA_VERIFICATION_ROOT_HASH = "android.content.pm.extra.VERIFICATION_ROOT_HASH"; field public static final int MATCH_STATIC_SHARED_AND_SDK_LIBRARIES = 67108864; // 0x4000000 @@ -141,18 +140,6 @@ package android.content.pm { method @NonNull public String getPackageName(); } - public final class SigningInfo implements android.os.Parcelable { - method @FlaggedApi("android.content.pm.cloud_compilation_pm") public boolean signersMatchExactly(@NonNull android.content.pm.SigningInfo); - field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_JAR = 1; // 0x1 - field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_SIGNING_BLOCK_V2 = 2; // 0x2 - field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_SIGNING_BLOCK_V3 = 3; // 0x3 - field @FlaggedApi("android.content.pm.cloud_compilation_pm") public static final int VERSION_SIGNING_BLOCK_V4 = 4; // 0x4 - } - - @FlaggedApi("android.content.pm.cloud_compilation_pm") public class SigningInfoException extends java.lang.Exception { - method @FlaggedApi("android.content.pm.cloud_compilation_pm") public int getCode(); - } - } package android.hardware.usb { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 9590e1ab19c9..e1d8fb11efb3 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -520,6 +520,9 @@ package android { field public static final int config_defaultCallScreening = 17039398; // 0x1040026 field public static final int config_defaultDialer = 17039395; // 0x1040023 field public static final int config_defaultNotes = 17039429; // 0x1040045 + field @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence_module") public static final int config_defaultOnDeviceIntelligenceDeviceConfigNamespace; + field @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence_module") public static final int config_defaultOnDeviceIntelligenceService; + field @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence_module") public static final int config_defaultOnDeviceSandboxedInferenceService; field @FlaggedApi("android.permission.flags.cross_user_role_platform_api_enabled") public static final int config_defaultReservedForTestingProfileGroupExclusivity; field @FlaggedApi("android.permission.flags.retail_demo_role_enabled") public static final int config_defaultRetailDemo = 17039432; // 0x1040048 field public static final int config_defaultSms = 17039396; // 0x1040024 @@ -5088,6 +5091,7 @@ package android.hardware.contexthub { field public static final int REASON_ENDPOINT_STOPPED = 6; // 0x6 field public static final int REASON_FAILURE = 0; // 0x0 field public static final int REASON_OPEN_ENDPOINT_SESSION_REQUEST_REJECTED = 3; // 0x3 + field public static final int REASON_PERMISSION_DENIED = 9; // 0x9 } public static final class HubEndpoint.Builder { @@ -10973,8 +10977,8 @@ package android.nfc.cardemulation { method @FlaggedApi("android.nfc.enable_nfc_mainline") public void setDynamicAidGroup(@NonNull android.nfc.cardemulation.AidGroup); method @FlaggedApi("android.nfc.enable_nfc_mainline") public void setOffHostSecureElement(@NonNull String); method @FlaggedApi("android.nfc.nfc_observe_mode") public void setShouldDefaultToObserveMode(boolean); - method @FlaggedApi("android.nfc.nfc_associated_role_services") public boolean shareRolePriority(); method @FlaggedApi("android.nfc.nfc_observe_mode") public boolean shouldDefaultToObserveMode(); + method @FlaggedApi("android.nfc.nfc_associated_role_services") public boolean wantsRoleHolderPriority(); method @FlaggedApi("android.nfc.enable_nfc_mainline") public void writeToParcel(@NonNull android.os.Parcel, int); field @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public static final android.os.Parcelable.Creator<android.nfc.cardemulation.ApduServiceInfo> CREATOR; field @FlaggedApi("android.permission.flags.wallet_role_icon_property_enabled") public static final String PROPERTY_WALLET_PREFERRED_BANNER_AND_LABEL = "android.nfc.cardemulation.PROPERTY_WALLET_PREFERRED_BANNER_AND_LABEL"; @@ -18699,7 +18703,6 @@ package android.telephony.satellite { method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public void requestIsSupported(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Boolean,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestNtnSignalStrength(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.telephony.satellite.NtnSignalStrength,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestSatelliteAccessConfigurationForCurrentLocation(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.telephony.satellite.SatelliteAccessConfiguration,android.telephony.satellite.SatelliteManager.SatelliteException>); - method @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestSatelliteDisplayName(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.CharSequence,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestSatelliteSubscriberProvisionStatus(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.util.List<android.telephony.satellite.SatelliteSubscriberProvisionStatus>,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestSelectedNbIotSatelliteSubscriptionId(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Integer,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestTimeForNextSatelliteVisibility(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.time.Duration,android.telephony.satellite.SatelliteManager.SatelliteException>); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 6230a59a62c0..5171e68cdb85 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1402,9 +1402,9 @@ package android.credentials.selection { method @NonNull public android.credentials.selection.GetCredentialProviderData.Builder setRemoteEntry(@Nullable android.credentials.selection.Entry); } - @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public class IntentFactory { - method @NonNull public static android.content.Intent createCancelUiIntent(@NonNull android.content.Context, @NonNull android.os.IBinder, boolean, @NonNull String); - method @NonNull public static android.content.Intent createCredentialSelectorIntent(@NonNull android.content.Context, @NonNull android.credentials.selection.RequestInfo, @NonNull java.util.ArrayList<android.credentials.selection.ProviderData>, @NonNull java.util.ArrayList<android.credentials.selection.DisabledProviderData>, @NonNull android.os.ResultReceiver); + @FlaggedApi("android.credentials.flags.propagate_user_context_for_intent_creation") public class IntentFactory { + method @NonNull public static android.content.Intent createCancelUiIntent(@NonNull android.content.Context, @NonNull android.os.IBinder, boolean, @NonNull String, int); + method @NonNull public static android.content.Intent createCredentialSelectorIntent(@NonNull android.content.Context, @NonNull android.credentials.selection.RequestInfo, @NonNull java.util.ArrayList<android.credentials.selection.ProviderData>, @NonNull java.util.ArrayList<android.credentials.selection.DisabledProviderData>, @NonNull android.os.ResultReceiver, int); } @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public abstract class ProviderData implements android.os.Parcelable { @@ -2431,6 +2431,12 @@ package android.os { method @NonNull public static byte[] digest(@NonNull java.io.InputStream, @NonNull String) throws java.io.IOException, java.security.NoSuchAlgorithmException; } + public class Handler { + method @FlaggedApi("android.os.mainline_vcn_platform_api") public final boolean hasMessagesOrCallbacks(); + method @FlaggedApi("android.os.mainline_vcn_platform_api") public final void removeCallbacksAndEqualMessages(@Nullable Object); + method @FlaggedApi("android.os.mainline_vcn_platform_api") public final void removeEqualMessages(int, @Nullable Object); + } + public class IpcDataCache<Query, Result> extends android.app.PropertyInvalidatedCache<Query,Result> { ctor public IpcDataCache(int, @NonNull String, @NonNull String, @NonNull String, @NonNull android.os.IpcDataCache.QueryHandler<Query,Result>); method public static void disableForCurrentProcess(@NonNull String); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 48b74f2d0776..ec173338f262 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -1975,8 +1975,12 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpCacheInfo(ParcelFileDescriptor pfd, String[] args) { - PropertyInvalidatedCache.dumpCacheInfo(pfd, args); - IoUtils.closeQuietly(pfd); + try { + PropertyInvalidatedCache.dumpCacheInfo(pfd, args); + BroadcastStickyCache.dumpCacheInfo(pfd); + } finally { + IoUtils.closeQuietly(pfd); + } } private File getDatabasesDir(Context context) { diff --git a/core/java/android/app/BroadcastStickyCache.java b/core/java/android/app/BroadcastStickyCache.java index 0b6cf59876d2..0ffbf2c3a6af 100644 --- a/core/java/android/app/BroadcastStickyCache.java +++ b/core/java/android/app/BroadcastStickyCache.java @@ -30,14 +30,20 @@ import android.net.wifi.WifiManager; import android.net.wifi.p2p.WifiP2pManager; import android.os.IpcDataCache; import android.os.IpcDataCache.Config; +import android.os.ParcelFileDescriptor; import android.os.UpdateLock; import android.telephony.TelephonyManager; import android.util.ArrayMap; +import android.util.IndentingPrintWriter; import android.view.WindowManagerPolicyConstants; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.FastPrintWriter; + +import java.io.FileOutputStream; +import java.io.PrintWriter; /** @hide */ public class BroadcastStickyCache { @@ -214,12 +220,50 @@ public class BroadcastStickyCache { // We only need 1 entry per cache but just to be on the safer side we are choosing 32 // although we don't expect more than 1. sActionConfigMap.put(action, - new Config(32, IpcDataCache.MODULE_SYSTEM, sActionApiNameMap.get(action))); + new Config(32, IpcDataCache.MODULE_SYSTEM, + sActionApiNameMap.get(action)).cacheNulls(true)); } return sActionConfigMap.get(action); } + public static void dumpCacheInfo(@NonNull ParcelFileDescriptor pfd) { + if (!Flags.useStickyBcastCache()) { + return; + } + final PrintWriter pw = new FastPrintWriter(new FileOutputStream(pfd.getFileDescriptor())); + synchronized (BroadcastStickyCache.class) { + dumpCacheLocked(pw); + } + pw.flush(); + } + + @GuardedBy("BroadcastStickyCache.class") + private static void dumpCacheLocked(@NonNull PrintWriter pw) { + final IndentingPrintWriter ipw = new IndentingPrintWriter( + pw, " " /* singleIndent */, " " /* prefix */); + ipw.println("Cached sticky broadcasts:"); + ipw.increaseIndent(); + final int count = sFilterCacheMap.size(); + if (count == 0) { + ipw.println("<empty>"); + } else { + for (int i = 0; i < count; ++i) { + final StickyBroadcastFilter stickyBroadcast = sFilterCacheMap.keyAt(i); + final IpcDataCache<Void, Intent> ipcDataCache = sFilterCacheMap.valueAt(i); + ipw.print("Entry #"); + ipw.print(i); + ipw.println(":"); + ipw.increaseIndent(); + ipw.print("action", stickyBroadcast.action).println(); + ipw.print("filter", stickyBroadcast.filter.toLongString()).println(); + ipcDataCache.dumpCacheEntries(pw); + ipw.decreaseIndent(); + } + } + ipw.decreaseIndent(); + } + @VisibleForTesting private record StickyBroadcastFilter(@NonNull IntentFilter filter, @NonNull String action) { } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 7e998d90e04f..aa2ada5372af 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -6024,8 +6024,9 @@ public class Notification implements Parcelable /** * @param isHeader If the notification is a notification header * @return An instance of mColors after resolving the palette + * @hide */ - private Colors getColors(boolean isHeader) { + public Colors getColors(boolean isHeader) { mColors.resolvePalette(mContext, mN.color, !isHeader && mN.isColorized(), mInNightMode); return mColors; } @@ -14765,7 +14766,6 @@ public class Notification implements Parcelable * A utility which stores and calculates the palette of colors used to color notifications. * @hide */ - @VisibleForTesting public static class Colors { private int mPaletteIsForRawColor = COLOR_INVALID; private boolean mPaletteIsForColorized = false; @@ -14839,10 +14839,7 @@ public class Notification implements Parcelable if (isColorized) { if (rawColor == COLOR_DEFAULT) { - int[] attrs = {R.attr.materialColorSecondary}; - try (TypedArray ta = obtainDayNightAttributes(ctx, attrs)) { - mBackgroundColor = getColor(ta, 0, Color.WHITE); - } + mBackgroundColor = ctx.getColor(R.color.materialColorSecondary); } else { mBackgroundColor = rawColor; } @@ -14874,30 +14871,25 @@ public class Notification implements Parcelable mRippleAlpha = 0x33; } else { int[] attrs = { - R.attr.materialColorSurfaceContainerHigh, - R.attr.materialColorOnSurface, - R.attr.materialColorOnSurfaceVariant, - R.attr.materialColorPrimary, - R.attr.materialColorSecondary, - R.attr.materialColorTertiary, - R.attr.materialColorOnTertiary, - R.attr.materialColorTertiaryFixedDim, - R.attr.materialColorOnTertiaryFixed, R.attr.colorError, R.attr.colorControlHighlight }; + + mBackgroundColor = ctx.getColor(R.color.materialColorSurfaceContainerHigh); + mPrimaryTextColor = ctx.getColor(R.color.materialColorOnSurface); + mSecondaryTextColor = ctx.getColor(R.color.materialColorOnSurfaceVariant); + mPrimaryAccentColor = ctx.getColor(R.color.materialColorPrimary); + mSecondaryAccentColor = ctx.getColor(R.color.materialColorSecondary); + mTertiaryAccentColor = ctx.getColor(R.color.materialColorTertiary); + mOnTertiaryAccentTextColor = ctx.getColor(R.color.materialColorOnTertiary); + mTertiaryFixedDimAccentColor = ctx.getColor( + R.color.materialColorTertiaryFixedDim); + mOnTertiaryFixedAccentTextColor = ctx.getColor( + R.color.materialColorOnTertiaryFixed); + try (TypedArray ta = obtainDayNightAttributes(ctx, attrs)) { - mBackgroundColor = getColor(ta, 0, nightMode ? Color.BLACK : Color.WHITE); - mPrimaryTextColor = getColor(ta, 1, COLOR_INVALID); - mSecondaryTextColor = getColor(ta, 2, COLOR_INVALID); - mPrimaryAccentColor = getColor(ta, 3, COLOR_INVALID); - mSecondaryAccentColor = getColor(ta, 4, COLOR_INVALID); - mTertiaryAccentColor = getColor(ta, 5, COLOR_INVALID); - mOnTertiaryAccentTextColor = getColor(ta, 6, COLOR_INVALID); - mTertiaryFixedDimAccentColor = getColor(ta, 7, COLOR_INVALID); - mOnTertiaryFixedAccentTextColor = getColor(ta, 8, COLOR_INVALID); - mErrorColor = getColor(ta, 9, COLOR_INVALID); - mRippleAlpha = Color.alpha(getColor(ta, 10, 0x33ffffff)); + mErrorColor = getColor(ta, 0, COLOR_INVALID); + mRippleAlpha = Color.alpha(getColor(ta, 1, 0x33ffffff)); } mContrastColor = calculateContrastColor(ctx, rawColor, mPrimaryAccentColor, mBackgroundColor, nightMode); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 87c861912036..8ed66eb7e6c0 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -49,7 +49,6 @@ import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; @@ -61,15 +60,18 @@ import android.provider.Settings; import android.provider.Settings.Global; import android.service.notification.Adjustment; import android.service.notification.Condition; +import android.service.notification.RateEstimator; import android.service.notification.StatusBarNotification; import android.service.notification.ZenDeviceEffects; import android.service.notification.ZenModeConfig; import android.service.notification.ZenPolicy; import android.util.Log; +import android.util.LruCache; import android.util.proto.ProtoOutputStream; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.time.InstantSource; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -643,9 +645,17 @@ public class NotificationManager { */ public static int MAX_SERVICE_COMPONENT_NAME_LENGTH = 500; + private static final float MAX_NOTIFICATION_ENQUEUE_RATE = 5f; + + private final Context mContext; private final Map<CallNotificationEventListener, CallNotificationEventCallbackStub> mCallNotificationEventCallbacks = new HashMap<>(); + private final InstantSource mClock; + private final RateEstimator mEnqueueRateEstimator = new RateEstimator(); + private final LruCache<String, Boolean> mEnqueuedNotificationKeys = new LruCache<>(10); + private final Object mEnqueueThrottleLock = new Object(); + @UnsupportedAppUsage private static INotificationManager sService; @@ -661,10 +671,17 @@ public class NotificationManager { return sService; } + /** @hide */ + protected INotificationManager service() { + return getService(); + } + + /** {@hide} */ @UnsupportedAppUsage - /*package*/ NotificationManager(Context context, Handler handler) + public NotificationManager(Context context, InstantSource clock) { mContext = context; + mClock = clock; } /** {@hide} */ @@ -736,7 +753,7 @@ public class NotificationManager { */ public void notifyAsPackage(@NonNull String targetPackage, @Nullable String tag, int id, @NonNull Notification notification) { - INotificationManager service = getService(); + INotificationManager service = service(); String sender = mContext.getPackageName(); try { @@ -752,13 +769,12 @@ public class NotificationManager { * @hide */ @UnsupportedAppUsage - public void notifyAsUser(String tag, int id, Notification notification, UserHandle user) + public void notifyAsUser(@Nullable String tag, int id, Notification notification, + UserHandle user) { - INotificationManager service = getService(); + INotificationManager service = service(); String pkg = mContext.getPackageName(); - - if (notificationClassification() - && NotificationChannel.SYSTEM_RESERVED_IDS.contains(notification.getChannelId())) { + if (discardNotify(tag, id, notification)) { return; } @@ -771,6 +787,37 @@ public class NotificationManager { } } + /** + * Determines whether a {@link #notify} call should be skipped. If the notification is not + * skipped, updates tracking metadata to use in future decisions. + */ + private boolean discardNotify(@Nullable String tag, int id, Notification notification) { + if (notificationClassification() + && NotificationChannel.SYSTEM_RESERVED_IDS.contains(notification.getChannelId())) { + return true; + } + + if (Flags.nmBinderPerfThrottleNotify()) { + String key = toEnqueuedNotificationKey(tag, id); + long now = mClock.millis(); + synchronized (mEnqueueThrottleLock) { + if (mEnqueuedNotificationKeys.get(key) != null + && !notification.hasCompletedProgress() + && mEnqueueRateEstimator.getRate(now) > MAX_NOTIFICATION_ENQUEUE_RATE) { + return true; + } + + mEnqueueRateEstimator.update(now); + mEnqueuedNotificationKeys.put(key, Boolean.TRUE); + } + } + + return false; + } + private static String toEnqueuedNotificationKey(@Nullable String tag, int id) { + return tag + "," + id; + } + private Notification fixNotification(Notification notification) { String pkg = mContext.getPackageName(); // Fix the notification as best we can. @@ -852,7 +899,7 @@ public class NotificationManager { * @param id An identifier for this notification. */ public void cancelAsPackage(@NonNull String targetPackage, @Nullable String tag, int id) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.cancelNotificationWithTag(targetPackage, mContext.getOpPackageName(), tag, id, mContext.getUser().getIdentifier()); @@ -865,9 +912,15 @@ public class NotificationManager { * @hide */ @UnsupportedAppUsage - public void cancelAsUser(String tag, int id, UserHandle user) + public void cancelAsUser(@Nullable String tag, int id, UserHandle user) { - INotificationManager service = getService(); + if (Flags.nmBinderPerfThrottleNotify()) { + synchronized (mEnqueueThrottleLock) { + mEnqueuedNotificationKeys.remove(toEnqueuedNotificationKey(tag, id)); + } + } + + INotificationManager service = service(); String pkg = mContext.getPackageName(); if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")"); try { @@ -884,7 +937,13 @@ public class NotificationManager { */ public void cancelAll() { - INotificationManager service = getService(); + if (Flags.nmBinderPerfThrottleNotify()) { + synchronized (mEnqueueThrottleLock) { + mEnqueuedNotificationKeys.evictAll(); + } + } + + INotificationManager service = service(); String pkg = mContext.getPackageName(); if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); try { @@ -907,7 +966,7 @@ public class NotificationManager { * @param delegate Package name of the app which can send notifications on your behalf. */ public void setNotificationDelegate(@Nullable String delegate) { - INotificationManager service = getService(); + INotificationManager service = service(); String pkg = mContext.getPackageName(); if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); try { @@ -922,7 +981,7 @@ public class NotificationManager { * your behalf, if there currently is one. */ public @Nullable String getNotificationDelegate() { - INotificationManager service = getService(); + INotificationManager service = service(); String pkg = mContext.getPackageName(); try { return service.getNotificationDelegate(pkg); @@ -938,7 +997,7 @@ public class NotificationManager { * See {@link #setNotificationDelegate(String)}. */ public boolean canNotifyAsPackage(@NonNull String pkg) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.canNotifyAsPackage(mContext.getPackageName(), pkg, mContext.getUserId()); } catch (RemoteException e) { @@ -956,7 +1015,7 @@ public class NotificationManager { * {@link android.provider.Settings#ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT}. */ public boolean canUseFullScreenIntent() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.canUseFullScreenIntent(mContext.getAttributionSource()); } catch (RemoteException e) { @@ -974,7 +1033,7 @@ public class NotificationManager { */ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING) public boolean canPostPromotedNotifications() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.canBePromoted(mContext.getPackageName()); } catch (RemoteException e) { @@ -989,7 +1048,7 @@ public class NotificationManager { @TestApi @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING) public void setCanPostPromotedNotifications(@NonNull String pkg, int uid, boolean allowed) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setCanBePromoted(pkg, uid, allowed, true); } catch (RemoteException e) { @@ -1024,7 +1083,7 @@ public class NotificationManager { * @param groups The list of groups to create */ public void createNotificationChannelGroups(@NonNull List<NotificationChannelGroup> groups) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.createNotificationChannelGroups(mContext.getPackageName(), new ParceledListSlice(groups)); @@ -1067,7 +1126,7 @@ public class NotificationManager { * @param channels the list of channels to attempt to create. */ public void createNotificationChannels(@NonNull List<NotificationChannel> channels) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.createNotificationChannels(mContext.getPackageName(), new ParceledListSlice(channels)); @@ -1085,7 +1144,7 @@ public class NotificationManager { * package (see {@link Context#createPackageContext(String, int)}).</p> */ public NotificationChannel getNotificationChannel(String channelId) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getNotificationChannel(mContext.getOpPackageName(), mContext.getUserId(), mContext.getPackageName(), channelId); @@ -1105,7 +1164,7 @@ public class NotificationManager { */ public @Nullable NotificationChannel getNotificationChannel(@NonNull String channelId, @NonNull String conversationId) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getConversationNotificationChannel(mContext.getOpPackageName(), mContext.getUserId(), mContext.getPackageName(), channelId, true, @@ -1124,7 +1183,7 @@ public class NotificationManager { * {@link Context#createPackageContext(String, int)}).</p> */ public List<NotificationChannel> getNotificationChannels() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getNotificationChannels(mContext.getOpPackageName(), mContext.getPackageName(), mContext.getUserId()).getList(); @@ -1145,7 +1204,7 @@ public class NotificationManager { && NotificationChannel.SYSTEM_RESERVED_IDS.contains(channelId)) { return; } - INotificationManager service = getService(); + INotificationManager service = service(); try { service.deleteNotificationChannel(mContext.getPackageName(), channelId); } catch (RemoteException e) { @@ -1159,7 +1218,7 @@ public class NotificationManager { * The channel group must belong to your package, or null will be returned. */ public NotificationChannelGroup getNotificationChannelGroup(String channelGroupId) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getNotificationChannelGroup(mContext.getPackageName(), channelGroupId); } catch (RemoteException e) { @@ -1171,7 +1230,7 @@ public class NotificationManager { * Returns all notification channel groups belonging to the calling app. */ public List<NotificationChannelGroup> getNotificationChannelGroups() { - INotificationManager service = getService(); + INotificationManager service = service(); try { final ParceledListSlice<NotificationChannelGroup> parceledList = service.getNotificationChannelGroups(mContext.getPackageName()); @@ -1189,7 +1248,7 @@ public class NotificationManager { * belong to it. */ public void deleteNotificationChannelGroup(String groupId) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.deleteNotificationChannelGroup(mContext.getPackageName(), groupId); } catch (RemoteException e) { @@ -1203,7 +1262,7 @@ public class NotificationManager { @TestApi public void updateNotificationChannel(@NonNull String pkg, int uid, @NonNull NotificationChannel channel) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.updateNotificationChannelForPackage(pkg, uid, channel); } catch (RemoteException e) { @@ -1216,7 +1275,7 @@ public class NotificationManager { */ @TestApi public ComponentName getEffectsSuppressor() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getEffectsSuppressor(); } catch (RemoteException e) { @@ -1228,7 +1287,7 @@ public class NotificationManager { * @hide */ public boolean matchesCallFilter(Bundle extras) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.matchesCallFilter(extras); } catch (RemoteException e) { @@ -1241,7 +1300,7 @@ public class NotificationManager { */ @TestApi public void cleanUpCallersAfter(long timeThreshold) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.cleanUpCallersAfter(timeThreshold); } catch (RemoteException e) { @@ -1253,7 +1312,7 @@ public class NotificationManager { * @hide */ public boolean isSystemConditionProviderEnabled(String path) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.isSystemConditionProviderEnabled(path); } catch (RemoteException e) { @@ -1271,7 +1330,7 @@ public class NotificationManager { /** @hide */ public void setZenMode(int mode, Uri conditionId, String reason, boolean fromUser) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setZenMode(mode, conditionId, reason, fromUser); } catch (RemoteException e) { @@ -1284,7 +1343,7 @@ public class NotificationManager { * @hide */ public int getZenMode() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getZenMode(); } catch (RemoteException e) { @@ -1297,7 +1356,7 @@ public class NotificationManager { */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public ZenModeConfig getZenModeConfig() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getZenModeConfig(); } catch (RemoteException e) { @@ -1315,7 +1374,7 @@ public class NotificationManager { * </p> */ public @NonNull NotificationManager.Policy getConsolidatedNotificationPolicy() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getConsolidatedNotificationPolicy(); } catch (RemoteException e) { @@ -1327,7 +1386,7 @@ public class NotificationManager { * @hide */ public int getRuleInstanceCount(ComponentName owner) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getRuleInstanceCount(owner); } catch (RemoteException e) { @@ -1364,7 +1423,7 @@ public class NotificationManager { * See {@link #isNotificationPolicyAccessGranted}. */ public Map<String, AutomaticZenRule> getAutomaticZenRules() { - INotificationManager service = getService(); + INotificationManager service = service(); try { if (Flags.modesApi()) { return service.getAutomaticZenRules(); @@ -1398,7 +1457,7 @@ public class NotificationManager { * doesn't own the matching rule. See {@link AutomaticZenRule#getOwner}. */ public AutomaticZenRule getAutomaticZenRule(String id) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getAutomaticZenRule(id); } catch (RemoteException e) { @@ -1426,7 +1485,7 @@ public class NotificationManager { @NonNull public String addAutomaticZenRule(@NonNull AutomaticZenRule automaticZenRule, boolean fromUser) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.addAutomaticZenRule(automaticZenRule, mContext.getPackageName(), fromUser); @@ -1461,7 +1520,7 @@ public class NotificationManager { @FlaggedApi(Flags.FLAG_MODES_API) public boolean updateAutomaticZenRule(@NonNull String id, @NonNull AutomaticZenRule automaticZenRule, boolean fromUser) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.updateAutomaticZenRule(id, automaticZenRule, fromUser); } catch (RemoteException e) { @@ -1481,7 +1540,7 @@ public class NotificationManager { @FlaggedApi(Flags.FLAG_MODES_API) @Condition.State public int getAutomaticZenRuleState(@NonNull String id) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getAutomaticZenRuleState(id); } catch (RemoteException e) { @@ -1527,7 +1586,7 @@ public class NotificationManager { * @param condition The new state of this rule */ public void setAutomaticZenRuleState(@NonNull String id, @NonNull Condition condition) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setAutomaticZenRuleState(id, condition); } catch (RemoteException e) { @@ -1555,7 +1614,7 @@ public class NotificationManager { @TestApi @FlaggedApi(Flags.FLAG_MODES_API) public boolean removeAutomaticZenRule(@NonNull String id, boolean fromUser) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.removeAutomaticZenRule(id, fromUser); } catch (RemoteException e) { @@ -1574,7 +1633,7 @@ public class NotificationManager { /** @hide */ public boolean removeAutomaticZenRules(String packageName, boolean fromUser) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.removeAutomaticZenRules(packageName, fromUser); } catch (RemoteException e) { @@ -1587,7 +1646,7 @@ public class NotificationManager { * package. */ public @Importance int getImportance() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getPackageImportance(mContext.getPackageName()); } catch (RemoteException e) { @@ -1602,7 +1661,7 @@ public class NotificationManager { if (Flags.nmBinderPerfPermissionCheck()) { return mContext.checkSelfPermission(POST_NOTIFICATIONS) == PERMISSION_GRANTED; } else { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.areNotificationsEnabled(mContext.getPackageName()); } catch (RemoteException e) { @@ -1623,7 +1682,7 @@ public class NotificationManager { */ @Deprecated public boolean areBubblesAllowed() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.areBubblesAllowed(mContext.getPackageName()); } catch (RemoteException e) { @@ -1638,7 +1697,7 @@ public class NotificationManager { * @see Notification.Builder#setBubbleMetadata(Notification.BubbleMetadata) */ public boolean areBubblesEnabled() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.areBubblesEnabled(mContext.getUser()); } catch (RemoteException e) { @@ -1665,7 +1724,7 @@ public class NotificationManager { * @return the users' bubble preference for the app. */ public @BubblePreference int getBubblePreference() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getBubblePreferenceForPackage(mContext.getPackageName(), Binder.getCallingUid()); @@ -1685,7 +1744,7 @@ public class NotificationManager { * @hide */ public void silenceNotificationSound() { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.silenceNotificationSound(); } catch (RemoteException e) { @@ -1701,7 +1760,7 @@ public class NotificationManager { * PersistableBundle, SuspendDialogInfo) suspended}. */ public boolean areNotificationsPaused() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.isPackagePaused(mContext.getPackageName()); } catch (RemoteException e) { @@ -1724,7 +1783,7 @@ public class NotificationManager { * user grant or denial of this access. */ public boolean isNotificationPolicyAccessGranted() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.isNotificationPolicyAccessGranted(mContext.getOpPackageName()); } catch (RemoteException e) { @@ -1745,7 +1804,7 @@ public class NotificationManager { * {@link android.provider.Settings#ACTION_NOTIFICATION_LISTENER_SETTINGS}. */ public boolean isNotificationListenerAccessGranted(ComponentName listener) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.isNotificationListenerAccessGranted(listener); } catch (RemoteException e) { @@ -1769,7 +1828,7 @@ public class NotificationManager { */ @SystemApi public boolean isNotificationAssistantAccessGranted(@NonNull ComponentName assistant) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.isNotificationAssistantAccessGranted(assistant); } catch (RemoteException e) { @@ -1785,7 +1844,7 @@ public class NotificationManager { * listeners}. */ public boolean shouldHideSilentStatusBarIcons() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.shouldHideSilentStatusIcons(mContext.getOpPackageName()); } catch (RemoteException e) { @@ -1804,7 +1863,7 @@ public class NotificationManager { */ @SystemApi public @NonNull @Adjustment.Keys List<String> getAllowedAssistantAdjustments() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getAllowedAssistantAdjustments(mContext.getOpPackageName()); } catch (RemoteException e) { @@ -1818,7 +1877,7 @@ public class NotificationManager { @TestApi @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION) public void allowAssistantAdjustment(@NonNull String capability) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.allowAssistantAdjustment(capability); } catch (RemoteException e) { @@ -1832,7 +1891,7 @@ public class NotificationManager { @TestApi @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION) public void disallowAssistantAdjustment(@NonNull String capability) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.disallowAssistantAdjustment(capability); } catch (RemoteException e) { @@ -1843,7 +1902,7 @@ public class NotificationManager { /** @hide */ @TestApi public boolean isNotificationPolicyAccessGrantedForPackage(@NonNull String pkg) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.isNotificationPolicyAccessGrantedForPackage(pkg); } catch (RemoteException e) { @@ -1857,7 +1916,7 @@ public class NotificationManager { @TestApi @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION) public void setAssistantAdjustmentKeyTypeState(@Adjustment.Types int type, boolean enabled) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setAssistantAdjustmentKeyTypeState(type, enabled); } catch (RemoteException e) { @@ -1870,7 +1929,7 @@ public class NotificationManager { */ @FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) public void setTypeAdjustmentForPackageState(@NonNull String pkg, boolean enabled) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setTypeAdjustmentForPackageState(pkg, enabled); } catch (RemoteException e) { @@ -1882,7 +1941,7 @@ public class NotificationManager { * @hide */ public List<String> getEnabledNotificationListenerPackages() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getEnabledNotificationListenerPackages(); } catch (RemoteException e) { @@ -1899,7 +1958,7 @@ public class NotificationManager { * {@link #setNotificationPolicy(Policy)}. */ public Policy getNotificationPolicy() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getNotificationPolicy(mContext.getOpPackageName()); } catch (RemoteException e) { @@ -1929,7 +1988,7 @@ public class NotificationManager { /** @hide */ public void setNotificationPolicy(@NonNull Policy policy, boolean fromUser) { checkRequired("policy", policy); - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setNotificationPolicy(mContext.getOpPackageName(), policy, fromUser); } catch (RemoteException e) { @@ -1939,7 +1998,7 @@ public class NotificationManager { /** @hide */ public void setNotificationPolicyAccessGranted(String pkg, boolean granted) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setNotificationPolicyAccessGranted(pkg, granted); } catch (RemoteException e) { @@ -1959,7 +2018,7 @@ public class NotificationManager { @TestApi @FlaggedApi(Flags.FLAG_MODES_API) public @NonNull ZenPolicy getDefaultZenPolicy() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getDefaultZenPolicy(); } catch (RemoteException e) { @@ -1971,7 +2030,7 @@ public class NotificationManager { */ @FlaggedApi(Flags.FLAG_MODES_UI) public void setManualZenRuleDeviceEffects(@NonNull ZenDeviceEffects effects) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setManualZenRuleDeviceEffects(effects); } catch (RemoteException e) { @@ -2008,7 +2067,7 @@ public class NotificationManager { @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public void setNotificationListenerAccessGranted( @NonNull ComponentName listener, boolean granted, boolean userSet) { - INotificationManager service = getService(); + INotificationManager service = service(); try { if (CompatChanges.isChangeEnabled(SET_LISTENER_ACCESS_GRANTED_IS_USER_AWARE)) { service.setNotificationListenerAccessGrantedForUser(listener, mContext.getUserId(), @@ -2024,7 +2083,7 @@ public class NotificationManager { /** @hide */ public void setNotificationListenerAccessGrantedForUser(ComponentName listener, int userId, boolean granted) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setNotificationListenerAccessGrantedForUser(listener, userId, granted, true); } catch (RemoteException e) { @@ -2045,7 +2104,7 @@ public class NotificationManager { @SystemApi public void setNotificationAssistantAccessGranted(@Nullable ComponentName assistant, boolean granted) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setNotificationAssistantAccessGranted(assistant, granted); } catch (RemoteException e) { @@ -2069,7 +2128,7 @@ public class NotificationManager { /** @hide */ public List<ComponentName> getEnabledNotificationListeners(int userId) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getEnabledNotificationListeners(userId); } catch (RemoteException e) { @@ -2080,7 +2139,7 @@ public class NotificationManager { /** @hide */ @SystemApi public @Nullable ComponentName getAllowedNotificationAssistant() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.getAllowedNotificationAssistant(); } catch (RemoteException e) { @@ -2100,16 +2159,13 @@ public class NotificationManager { @SuppressLint("UserHandle") public boolean hasEnabledNotificationListener(@NonNull String packageName, @NonNull UserHandle userHandle) { - INotificationManager service = getService(); + INotificationManager service = service(); try { return service.hasEnabledNotificationListener(packageName, userHandle.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } - - private Context mContext; - private static void checkRequired(String name, Object value) { if (value == null) { throw new IllegalArgumentException(name + " is required"); @@ -2125,7 +2181,7 @@ public class NotificationManager { @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_TOAST_RATE_LIMITING) public void setToastRateLimitingEnabled(boolean enable) { - INotificationManager service = getService(); + INotificationManager service = service(); try { service.setToastRateLimitingEnabled(enable); } catch (RemoteException e) { @@ -2917,7 +2973,7 @@ public class NotificationManager { * @return An array of {@link StatusBarNotification}. */ public StatusBarNotification[] getActiveNotifications() { - final INotificationManager service = getService(); + final INotificationManager service = service(); final String pkg = mContext.getPackageName(); try { final ParceledListSlice<StatusBarNotification> parceledList @@ -2940,7 +2996,7 @@ public class NotificationManager { * globally. */ public final @InterruptionFilter int getCurrentInterruptionFilter() { - final INotificationManager service = getService(); + final INotificationManager service = service(); try { return zenModeToInterruptionFilter(service.getZenMode()); } catch (RemoteException e) { @@ -2972,7 +3028,7 @@ public class NotificationManager { /** @hide */ public final void setInterruptionFilter(@InterruptionFilter int interruptionFilter, boolean fromUser) { - final INotificationManager service = getService(); + final INotificationManager service = service(); try { service.setInterruptionFilter(mContext.getOpPackageName(), interruptionFilter, fromUser); @@ -3130,7 +3186,7 @@ public class NotificationManager { checkRequired("userHandle", userHandle); checkRequired("executor", executor); checkRequired("listener", listener); - INotificationManager service = getService(); + INotificationManager service = service(); try { synchronized (mCallNotificationEventCallbacks) { CallNotificationEventCallbackStub callbackStub = @@ -3161,7 +3217,7 @@ public class NotificationManager { public void unregisterCallNotificationEventListener( @NonNull CallNotificationEventListener listener) { checkRequired("listener", listener); - INotificationManager service = getService(); + INotificationManager service = service(); try { synchronized (mCallNotificationEventCallbacks) { CallNotificationEventCallbackStub callbackStub = @@ -3184,7 +3240,7 @@ public class NotificationManager { @TestApi @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION) public @NonNull Set<String> getUnsupportedAdjustmentTypes() { - INotificationManager service = getService(); + INotificationManager service = service(); try { return new HashSet<>(service.getUnsupportedAdjustmentTypes()); } catch (RemoteException e) { diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java index 1e971a5c736a..c72c4c8feb71 100644 --- a/core/java/android/app/PropertyInvalidatedCache.java +++ b/core/java/android/app/PropertyInvalidatedCache.java @@ -17,13 +17,13 @@ package android.app; import static android.text.TextUtils.formatSimple; + import static com.android.internal.util.Preconditions.checkArgumentPositive; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; import android.os.Binder; -import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -2326,6 +2326,19 @@ public class PropertyInvalidatedCache<Query, Result> { } /** + * This dumps the detailed entries (Query and Result) inside the current instance of the + * {@link PropertyInvalidatedCache}. + * + * @param pw The PrintWriter object for the output stream. + * @hide + */ + public void dumpCacheEntries(@NonNull PrintWriter pw) { + synchronized (mLock) { + mCache.dumpDetailed(pw); + } + } + + /** * Nonces in shared memory are supported by a string block that acts as a table of contents * for nonce names, and an array of nonce values. There are two key design principles with * respect to nonce maps: diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 248e0433232a..920b19cd8f78 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -289,6 +289,7 @@ import com.android.internal.os.IDropBoxManagerService; import com.android.internal.policy.PhoneLayoutInflater; import com.android.internal.util.Preconditions; +import java.time.InstantSource; import java.util.Map; import java.util.Objects; @@ -625,7 +626,7 @@ public final class SystemServiceRegistry { com.android.internal.R.style.Theme_Holo_Dialog, com.android.internal.R.style.Theme_DeviceDefault_Dialog, com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)), - ctx.mMainThread.getHandler()); + InstantSource.system()); }}); registerService(Context.PEOPLE_SERVICE, PeopleManager.class, diff --git a/core/java/android/app/TEST_MAPPING b/core/java/android/app/TEST_MAPPING index 637187e01160..e93d8bdb9c57 100644 --- a/core/java/android/app/TEST_MAPPING +++ b/core/java/android/app/TEST_MAPPING @@ -157,6 +157,10 @@ "file_patterns": ["(/|^)ContextImpl.java"] }, { + "name": "BroadcastUnitTests", + "file_patterns": ["(/|^)BroadcastStickyCache.java"] + }, + { "file_patterns": [ "(/|^)Activity.*.java", "(/|^)PendingIntent.java", @@ -177,10 +181,6 @@ { "file_patterns": ["(/|^)AppOpsManager.java"], "name": "CtsAppOpsTestCases" - }, - { - "file_patterns": ["(/|^)BroadcastStickyCache.java"], - "name": "BroadcastUnitTests" } ] } diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 89e25e7d1b4f..360376da618c 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -2730,6 +2730,7 @@ public class WallpaperManager { * @param allowBackup {@code true} if the OS is permitted to back up this wallpaper * image for restore to a future device; {@code false} otherwise. * @param which Flags indicating which wallpaper(s) to configure with the new imagery. + * @return An integer ID assigned to the newly active wallpaper; or zero on failure. * @hide */ @FlaggedApi(FLAG_LIVE_WALLPAPER_CONTENT_HANDLING) diff --git a/core/java/android/app/appfunctions/AppFunctionManager.java b/core/java/android/app/appfunctions/AppFunctionManager.java index ed088fed41c2..a731e5085466 100644 --- a/core/java/android/app/appfunctions/AppFunctionManager.java +++ b/core/java/android/app/appfunctions/AppFunctionManager.java @@ -34,6 +34,7 @@ import android.os.ICancellationSignal; import android.os.OutcomeReceiver; import android.os.ParcelableException; import android.os.RemoteException; +import android.os.SystemClock; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -179,7 +180,8 @@ public final class AppFunctionManager { ExecuteAppFunctionAidlRequest aidlRequest = new ExecuteAppFunctionAidlRequest( - request, mContext.getUser(), mContext.getPackageName()); + request, mContext.getUser(), mContext.getPackageName(), + /* requestTime= */ SystemClock.elapsedRealtime()); try { ICancellationSignal cancellationTransport = diff --git a/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java b/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java index e623fa10f474..707d1fc0473e 100644 --- a/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java +++ b/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java @@ -41,8 +41,9 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable { ExecuteAppFunctionRequest.CREATOR.createFromParcel(in); UserHandle userHandle = UserHandle.CREATOR.createFromParcel(in); String callingPackage = in.readString8(); + long requestTime = in.readLong(); return new ExecuteAppFunctionAidlRequest( - clientRequest, userHandle, callingPackage); + clientRequest, userHandle, callingPackage, requestTime); } @Override @@ -60,11 +61,15 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable { /** The package name of the app that is requesting to execute the app function. */ private final String mCallingPackage; - public ExecuteAppFunctionAidlRequest( - ExecuteAppFunctionRequest clientRequest, UserHandle userHandle, String callingPackage) { + /** The time of calling executeAppFunction(). */ + private final long mRequestTime; + + public ExecuteAppFunctionAidlRequest(ExecuteAppFunctionRequest clientRequest, + UserHandle userHandle, String callingPackage, long requestTime) { this.mClientRequest = Objects.requireNonNull(clientRequest); this.mUserHandle = Objects.requireNonNull(userHandle); this.mCallingPackage = Objects.requireNonNull(callingPackage); + this.mRequestTime = requestTime; } @Override @@ -77,6 +82,7 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable { mClientRequest.writeToParcel(dest, flags); mUserHandle.writeToParcel(dest, flags); dest.writeString8(mCallingPackage); + dest.writeLong(mRequestTime); } /** Returns the client request to execute an app function. */ @@ -96,4 +102,9 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable { public String getCallingPackage() { return mCallingPackage; } + + /** Returns the time of calling executeAppFunction(). */ + public long getRequestTime() { + return mRequestTime; + } } diff --git a/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java b/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java index 2426daf5c9f2..e527de209a75 100644 --- a/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java +++ b/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java @@ -17,11 +17,14 @@ package android.app.appfunctions; import android.annotation.NonNull; +import android.annotation.Nullable; import android.os.RemoteException; +import android.os.SystemClock; import android.util.Log; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; /** * A wrapper of IExecuteAppFunctionCallback which swallows the {@link RemoteException}. This @@ -37,8 +40,19 @@ public class SafeOneTimeExecuteAppFunctionCallback { @NonNull private final IExecuteAppFunctionCallback mCallback; + @Nullable + private final CompletionCallback mCompletionCallback; + + private final AtomicLong mExecutionStartTimeAfterBindMillis = new AtomicLong(); + public SafeOneTimeExecuteAppFunctionCallback(@NonNull IExecuteAppFunctionCallback callback) { + this(callback, /* completionCallback= */ null); + } + + public SafeOneTimeExecuteAppFunctionCallback(@NonNull IExecuteAppFunctionCallback callback, + @Nullable CompletionCallback completionCallback) { mCallback = Objects.requireNonNull(callback); + mCompletionCallback = completionCallback; } /** Invoke wrapped callback with the result. */ @@ -49,6 +63,10 @@ public class SafeOneTimeExecuteAppFunctionCallback { } try { mCallback.onSuccess(result); + if (mCompletionCallback != null) { + mCompletionCallback.finalizeOnSuccess(result, + mExecutionStartTimeAfterBindMillis.get()); + } } catch (RemoteException ex) { // Failed to notify the other end. Ignore. Log.w(TAG, "Failed to invoke the callback", ex); @@ -63,6 +81,10 @@ public class SafeOneTimeExecuteAppFunctionCallback { } try { mCallback.onError(error); + if (mCompletionCallback != null) { + mCompletionCallback.finalizeOnError(error, + mExecutionStartTimeAfterBindMillis.get()); + } } catch (RemoteException ex) { // Failed to notify the other end. Ignore. Log.w(TAG, "Failed to invoke the callback", ex); @@ -76,4 +98,27 @@ public class SafeOneTimeExecuteAppFunctionCallback { public void disable() { mOnResultCalled.set(true); } + + /** + * Sets the execution start time of the request. Used to calculate the overhead latency of + * requests. + */ + public void setExecutionStartTimeMillis() { + if (!mExecutionStartTimeAfterBindMillis.compareAndSet(0, SystemClock.elapsedRealtime())) { + Log.w(TAG, "Ignore subsequent calls to setExecutionStartTimeMillis()"); + } + } + + /** + * Provides a hook to execute additional actions after the {@link IExecuteAppFunctionCallback} + * has been invoked. + */ + public interface CompletionCallback { + /** Called after {@link IExecuteAppFunctionCallback#onSuccess}. */ + void finalizeOnSuccess(@NonNull ExecuteAppFunctionResponse result, + long executionStartTimeMillis); + + /** Called after {@link IExecuteAppFunctionCallback#onError}. */ + void finalizeOnError(@NonNull AppFunctionException error, long executionStartTimeMillis); + } } diff --git a/core/java/android/app/jank/JankTracker.java b/core/java/android/app/jank/JankTracker.java index 469521668d25..a04f96a9f6e3 100644 --- a/core/java/android/app/jank/JankTracker.java +++ b/core/java/android/app/jank/JankTracker.java @@ -29,6 +29,7 @@ import android.view.ViewTreeObserver; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; +import java.util.HashMap; /** * This class is responsible for registering callbacks that will receive JankData batches. @@ -174,6 +175,15 @@ public class JankTracker { } /** + * Retrieve all pending jank stats before they are logged, this is intended for testing + * purposes only. + */ + @VisibleForTesting + public HashMap<String, JankDataProcessor.PendingJankStat> getPendingJankStats() { + return mJankDataProcessor.getPendingJankStats(); + } + + /** * Only intended to be used by tests, the runnable that registers the listeners may not run * in time for tests to pass. This forces them to run immediately. */ @@ -192,7 +202,11 @@ public class JankTracker { */ } - private boolean shouldTrack() { + /** + * Returns whether jank tracking is enabled or not. + */ + @VisibleForTesting + public boolean shouldTrack() { return mTrackingEnabled && mListenersRegistered; } diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig index 7543fa9f581f..b1db1379e400 100644 --- a/core/java/android/app/notification.aconfig +++ b/core/java/android/app/notification.aconfig @@ -291,6 +291,13 @@ flag { } flag { + name: "nm_binder_perf_throttle_notify" + namespace: "systemui" + description: "Rate-limit calls to enqueueNotificationWithTag client-side" + bug: "362981561" +} + +flag { name: "no_sbnholder" namespace: "systemui" description: "removes sbnholder from NLS" diff --git a/core/java/android/app/wallpaper/WallpaperDescription.java b/core/java/android/app/wallpaper/WallpaperDescription.java index ca2d9e676a02..999a5da870ad 100644 --- a/core/java/android/app/wallpaper/WallpaperDescription.java +++ b/core/java/android/app/wallpaper/WallpaperDescription.java @@ -118,14 +118,16 @@ public final class WallpaperDescription implements Parcelable { } /** - * @return the title for this wallpaper, with each list element intended to be a separate - * line, or {@code null} if not provided + * @return the title for this wallpaper, or {@code null} if not provided */ @Nullable public CharSequence getTitle() { return mTitle; } - /** @return the description for this wallpaper */ + /** + * @return the description for this wallpaper, with each list element intended to be shown on a + * separate line in the UI + */ @NonNull public List<CharSequence> getDescription() { return mDescription; diff --git a/core/java/android/companion/AssociationRequest.java b/core/java/android/companion/AssociationRequest.java index f368935a74c8..32cbf326c923 100644 --- a/core/java/android/companion/AssociationRequest.java +++ b/core/java/android/companion/AssociationRequest.java @@ -90,9 +90,9 @@ public final class AssociationRequest implements Parcelable { public static final String DEVICE_PROFILE_GLASSES = "android.app.role.COMPANION_DEVICE_GLASSES"; /** - * Device profile: a virtual display capable of rendering Android applications, and sending back + * Device profile: a virtual device capable of rendering Android applications, and sending back * input events. - * + * <p> * Only applications that have been granted * {@link android.Manifest.permission#REQUEST_COMPANION_PROFILE_APP_STREAMING} are allowed to * request to be associated with such devices. @@ -106,7 +106,7 @@ public final class AssociationRequest implements Parcelable { /** * Device profile: a virtual device capable of rendering content from an Android host to a * nearby device. - * + * <p> * Only applications that have been granted * {@link android.Manifest.permission#REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING} * are allowed to request to be associated with such devices. @@ -118,6 +118,21 @@ public final class AssociationRequest implements Parcelable { "android.app.role.COMPANION_DEVICE_NEARBY_DEVICE_STREAMING"; /** + * Device profile: a virtual device capable of streaming sensor data such as camera, audio and + * IMU between an Android host and a nearby device. + * <p> + * Only applications that have been granted + * {@link android.Manifest.permission#REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING} + * are allowed to request to be associated with such devices. + * + * @see AssociationRequest.Builder#setDeviceProfile + */ + @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ENABLE_LIMITED_VDM_ROLE) + @RequiresPermission(Manifest.permission.REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING) + public static final String DEVICE_PROFILE_SENSOR_DEVICE_STREAMING = + "android.app.role.COMPANION_DEVICE_SENSOR_DEVICE_STREAMING"; + + /** * Device profile: Android Automotive Projection * * Only applications that have been granted diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java index b3f09a98d623..ed2fd99c55c5 100644 --- a/core/java/android/companion/virtual/VirtualDeviceManager.java +++ b/core/java/android/companion/virtual/VirtualDeviceManager.java @@ -1290,7 +1290,11 @@ public final class VirtualDeviceManager { @NonNull UserHandle user) {} /** - * Called when a window with a secure surface is no longer shown on the device. + * Called when there is no longer any window with a secure surface shown on the device. + * + * <p>This is only called once there are no more secure windows shown on the device. If + * there are multiple secure windows shown on the device, this callback will be called only + * once all of them are hidden.</p> * * @param displayId The display ID on which the window was shown before. * diff --git a/core/java/android/companion/virtualnative/IVirtualDeviceManagerNative.aidl b/core/java/android/companion/virtualnative/IVirtualDeviceManagerNative.aidl index 5a1325519699..78f8ab46f989 100644 --- a/core/java/android/companion/virtualnative/IVirtualDeviceManagerNative.aidl +++ b/core/java/android/companion/virtualnative/IVirtualDeviceManagerNative.aidl @@ -64,4 +64,9 @@ interface IVirtualDeviceManagerNative { * Returns the device policy for the given virtual device and policy type. */ int getDevicePolicy(int deviceId, int policyType); + + /** + * Returns the ID of the device which owns the display with the given ID. + */ + int getDeviceIdForDisplayId(int displayId); } diff --git a/core/java/android/content/EventLogTags.logtags b/core/java/android/content/EventLogTags.logtags index 21ea90ad2e1e..861a5b72c86c 100644 --- a/core/java/android/content/EventLogTags.logtags +++ b/core/java/android/content/EventLogTags.logtags @@ -1,4 +1,4 @@ -# See system/core/logcat/event.logtags for a description of the format of this file. +# See system/logging/logcat/event.logtags for a description of the format of this file. option java_package android.content; diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index a6492d36cf8f..3d75423edfa9 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -12291,7 +12291,6 @@ public class Intent implements Parcelable, Cloneable { private IBinder mCreatorToken; // Stores all extra keys whose values are intents for a top level intent. private ArraySet<NestedIntentKey> mNestedIntentKeys; - } /** @@ -12353,6 +12352,7 @@ public class Intent implements Parcelable, Cloneable { public int hashCode() { return Objects.hash(mType, mKey, mIndex); } + } private @Nullable CreatorTokenInfo mCreatorTokenInfo; @@ -12416,7 +12416,7 @@ public class Intent implements Parcelable, Cloneable { // removeLaunchSecurityProtection() is called before it is launched. value = null; } - if (value instanceof Intent intent && !visited.contains(intent)) { + if (value instanceof Intent intent) { handleNestedIntent(intent, visited, new NestedIntentKey( NestedIntentKey.NESTED_INTENT_KEY_TYPE_EXTRA_PARCEL, key, 0)); } else if (value instanceof Parcelable[] parcelables) { @@ -12439,7 +12439,6 @@ public class Intent implements Parcelable, Cloneable { } private void handleNestedIntent(Intent intent, Set<Intent> visited, NestedIntentKey key) { - visited.add(intent); if (mCreatorTokenInfo == null) { mCreatorTokenInfo = new CreatorTokenInfo(); } @@ -12447,7 +12446,10 @@ public class Intent implements Parcelable, Cloneable { mCreatorTokenInfo.mNestedIntentKeys = new ArraySet<>(); } mCreatorTokenInfo.mNestedIntentKeys.add(key); - intent.collectNestedIntentKeysRecur(visited); + if (!visited.contains(intent)) { + visited.add(intent); + intent.collectNestedIntentKeysRecur(visited); + } } private void handleParcelableArray(Parcelable[] parcelables, String key, Set<Intent> visited) { diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 7e0805137d0b..438a21b7942f 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3151,16 +3151,6 @@ public abstract class PackageManager { public static final long MAXIMUM_VERIFICATION_TIMEOUT = 60*60*1000; /** - * As the generated feature count is useful for classes that may not be compiled in the same - * annotation processing unit as PackageManager, we redeclare it here for visibility. - * - * @hide - */ - @VisibleForTesting - public static final int SDK_FEATURE_COUNT = - com.android.internal.pm.SystemFeaturesMetadata.SDK_FEATURE_COUNT; - - /** * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device's * audio pipeline is low-latency, more suitable for audio applications sensitive to delays or * lag in sound input or output. @@ -12023,11 +12013,8 @@ public abstract class PackageManager { * file. * * @throws SigningInfoException if the verification fails - * - * @hide */ @FlaggedApi(android.content.pm.Flags.FLAG_CLOUD_COMPILATION_PM) - @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public static @NonNull SigningInfo getVerifiedSigningInfo(@NonNull String path, @AppSigningSchemeVersion int minAppSigningSchemeVersion) throws SigningInfoException { ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); @@ -12039,4 +12026,28 @@ public abstract class PackageManager { } return new SigningInfo(result.getResult()); } + + /** + * As the generated feature count is useful for classes that may not be compiled in the same + * annotation processing unit as PackageManager, we redeclare it here for visibility. + * + * @hide + */ + @VisibleForTesting + public static final int SDK_FEATURE_COUNT = + com.android.internal.pm.SystemFeaturesMetadata.SDK_FEATURE_COUNT; + + /** + * Returns a stable index for PackageManager-defined features. + * + * <p> Similar to {@link #SDK_FEATURE_COUNT}, we redeclare this utility method generated by the + * annotation processor for internal visibility. + * + * @return index in [0, {@link #SDK_FEATURECOUNT}) for PackageManager-defined features, else -1. + * @hide + */ + @VisibleForTesting + public static int maybeGetSdkFeatureIndex(String featureName) { + return com.android.internal.pm.SystemFeaturesMetadata.maybeGetSdkFeatureIndex(featureName); + } } diff --git a/core/java/android/content/pm/SigningInfo.java b/core/java/android/content/pm/SigningInfo.java index e4fbd1f28dbb..21bbb0a0a81c 100644 --- a/core/java/android/content/pm/SigningInfo.java +++ b/core/java/android/content/pm/SigningInfo.java @@ -22,7 +22,6 @@ import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.content.pm.SigningDetails.SignatureSchemeVersion; import android.os.Parcel; import android.os.Parcelable; @@ -40,41 +39,29 @@ public final class SigningInfo implements Parcelable { /** * JAR signing (v1 scheme). * See https://source.android.com/docs/security/features/apksigning#v1. - * - * @hide */ @FlaggedApi(Flags.FLAG_CLOUD_COMPILATION_PM) - @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public static final int VERSION_JAR = SignatureSchemeVersion.JAR; /** * APK signature scheme v2. * See https://source.android.com/docs/security/features/apksigning/v2. - * - * @hide */ @FlaggedApi(Flags.FLAG_CLOUD_COMPILATION_PM) - @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public static final int VERSION_SIGNING_BLOCK_V2 = SignatureSchemeVersion.SIGNING_BLOCK_V2; /** * APK signature scheme v3. * See https://source.android.com/docs/security/features/apksigning/v3. - * - * @hide */ @FlaggedApi(Flags.FLAG_CLOUD_COMPILATION_PM) - @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public static final int VERSION_SIGNING_BLOCK_V3 = SignatureSchemeVersion.SIGNING_BLOCK_V3; /** * APK signature scheme v4. * See https://source.android.com/docs/security/features/apksigning/v4. - * - * @hide */ @FlaggedApi(Flags.FLAG_CLOUD_COMPILATION_PM) - @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public static final int VERSION_SIGNING_BLOCK_V4 = SignatureSchemeVersion.SIGNING_BLOCK_V4; /** @hide */ @@ -255,11 +242,8 @@ public final class SigningInfo implements Parcelable { /** * Returns true if the signing certificates in this and other match exactly. - * - * @hide */ @FlaggedApi(Flags.FLAG_CLOUD_COMPILATION_PM) - @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public boolean signersMatchExactly(@NonNull SigningInfo other) { return mSigningDetails.signaturesMatchExactly(other.mSigningDetails); } diff --git a/core/java/android/content/pm/SigningInfoException.java b/core/java/android/content/pm/SigningInfoException.java index a81e07e73685..2fd1bfb46f4c 100644 --- a/core/java/android/content/pm/SigningInfoException.java +++ b/core/java/android/content/pm/SigningInfoException.java @@ -19,17 +19,13 @@ package android.content.pm; import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; /** * Indicates an error when verifying the * <a href="https://source.android.com/docs/security/features/apksigning">app signing</a> * information. - * - * @hide */ @FlaggedApi(Flags.FLAG_CLOUD_COMPILATION_PM) -@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public class SigningInfoException extends Exception { private final int mCode; diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig index dfeee2a2335f..00ddae334ef2 100644 --- a/core/java/android/content/pm/flags.aconfig +++ b/core/java/android/content/pm/flags.aconfig @@ -362,3 +362,9 @@ flag { is_fixed_read_only: true } +flag { + name: "remove_hidden_module_usage" + namespace: "modularization" + description: "Feature flag to remove the consumption of the hidden module status (ModuleInfo#IsHidden) in the Android source tree." + bug: "363952383" +} diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java index 18a45d8d442e..53813012b4b3 100644 --- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java @@ -539,9 +539,6 @@ public class ApkLiteParseUtils { hasBindDeviceAdminPermission); break; case TAG_USES_SDK_LIBRARY: - if (!android.content.pm.Flags.sdkDependencyInstaller()) { - break; - } String usesSdkLibName = parser.getAttributeValue( ANDROID_RES_NAMESPACE, "name"); // TODO(b/379219371): Due to a bug in bundletool, some apps can use diff --git a/core/java/android/content/res/flags.aconfig b/core/java/android/content/res/flags.aconfig index 6fc7d90a8237..ecb4bb1394b6 100644 --- a/core/java/android/content/res/flags.aconfig +++ b/core/java/android/content/res/flags.aconfig @@ -114,3 +114,11 @@ flag { bug: "373535266" is_fixed_read_only: true } + +flag { + name: "self_targeting_android_resource_frro" + is_exported: true + namespace: "customization_picker" + description: "Fixes bug in Launcher preview by enabling overlays targeting 'android'" + bug: "377545987" +}
\ No newline at end of file diff --git a/core/java/android/content/res/loader/ResourcesProvider.java b/core/java/android/content/res/loader/ResourcesProvider.java index 830b7e0fa2d0..7eba1819d148 100644 --- a/core/java/android/content/res/loader/ResourcesProvider.java +++ b/core/java/android/content/res/loader/ResourcesProvider.java @@ -25,6 +25,7 @@ import android.content.om.OverlayManager; import android.content.pm.ApplicationInfo; import android.content.res.ApkAssets; import android.content.res.AssetFileDescriptor; +import android.content.res.Flags; import android.os.ParcelFileDescriptor; import android.util.Log; @@ -90,6 +91,10 @@ public class ResourcesProvider implements AutoCloseable, Closeable { throws IOException { Objects.requireNonNull(overlayInfo); Preconditions.checkArgument(overlayInfo.isFabricated(), "Not accepted overlay"); + if (!Flags.selfTargetingAndroidResourceFrro()) { + Preconditions.checkStringNotEmpty( + overlayInfo.getTargetOverlayableName(), "Without overlayable name"); + } final String overlayName = OverlayManagerImpl.checkOverlayNameValid(overlayInfo.getOverlayName()); final String path = diff --git a/core/java/android/credentials/flags.aconfig b/core/java/android/credentials/flags.aconfig index d8d4e161006c..9c811fb84da3 100644 --- a/core/java/android/credentials/flags.aconfig +++ b/core/java/android/credentials/flags.aconfig @@ -124,3 +124,13 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + namespace: "credential_manager" + name: "settings_w_fixes" + description: "Settings improvements for credential manager" + bug: "373711451" + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/core/java/android/credentials/selection/IntentFactory.java b/core/java/android/credentials/selection/IntentFactory.java index c521b96fd8ee..59539c40d636 100644 --- a/core/java/android/credentials/selection/IntentFactory.java +++ b/core/java/android/credentials/selection/IntentFactory.java @@ -16,7 +16,7 @@ package android.credentials.selection; -import static android.credentials.flags.Flags.FLAG_CONFIGURABLE_SELECTOR_UI_ENABLED; +import static android.credentials.flags.Flags.FLAG_PROPAGATE_USER_CONTEXT_FOR_INTENT_CREATION; import static android.credentials.flags.Flags.configurableSelectorUiEnabled; import android.annotation.FlaggedApi; @@ -24,6 +24,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.TestApi; +import android.annotation.UserIdInt; +import android.app.AppGlobals; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -32,6 +34,7 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.IBinder; import android.os.Parcel; +import android.os.RemoteException; import android.os.ResultReceiver; import android.text.TextUtils; import android.util.Slog; @@ -46,7 +49,7 @@ import java.util.ArrayList; * @hide */ @TestApi -@FlaggedApi(FLAG_CONFIGURABLE_SELECTOR_UI_ENABLED) +@FlaggedApi(FLAG_PROPAGATE_USER_CONTEXT_FOR_INTENT_CREATION) public class IntentFactory { /** @@ -65,9 +68,10 @@ public class IntentFactory { @SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling. @NonNull ArrayList<DisabledProviderData> disabledProviderDataList, - @NonNull ResultReceiver resultReceiver) { + @NonNull ResultReceiver resultReceiver, + @UserIdInt int userId) { return createCredentialSelectorIntentInternal(context, requestInfo, - disabledProviderDataList, resultReceiver); + disabledProviderDataList, resultReceiver, userId); } /** @@ -96,9 +100,10 @@ public class IntentFactory { @SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling. @NonNull ArrayList<DisabledProviderData> disabledProviderDataList, - @NonNull ResultReceiver resultReceiver) { + @NonNull ResultReceiver resultReceiver, + @UserIdInt int userId) { IntentCreationResult result = createCredentialSelectorIntentInternal(context, requestInfo, - disabledProviderDataList, resultReceiver); + disabledProviderDataList, resultReceiver, userId); result.getIntent().putParcelableArrayListExtra( ProviderData.EXTRA_ENABLED_PROVIDER_DATA_LIST, enabledProviderDataList); return result; @@ -130,9 +135,10 @@ public class IntentFactory { @SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling. @NonNull ArrayList<DisabledProviderData> disabledProviderDataList, - @NonNull ResultReceiver resultReceiver) { + @NonNull ResultReceiver resultReceiver, @UserIdInt int userId) { return createCredentialSelectorIntentForCredMan(context, requestInfo, - enabledProviderDataList, disabledProviderDataList, resultReceiver).getIntent(); + enabledProviderDataList, disabledProviderDataList, resultReceiver, + userId).getIntent(); } /** @@ -142,10 +148,10 @@ public class IntentFactory { @NonNull public static Intent createCancelUiIntent(@NonNull Context context, @NonNull IBinder requestToken, boolean shouldShowCancellationUi, - @NonNull String appPackageName) { + @NonNull String appPackageName, @UserIdInt int userId) { Intent intent = new Intent(); IntentCreationResult.Builder intentResultBuilder = new IntentCreationResult.Builder(intent); - setCredentialSelectorUiComponentName(context, intent, intentResultBuilder); + setCredentialSelectorUiComponentName(context, intent, intentResultBuilder, userId); intent.putExtra(CancelSelectionRequest.EXTRA_CANCEL_UI_REQUEST, new CancelSelectionRequest(new RequestToken(requestToken), shouldShowCancellationUi, appPackageName)); @@ -162,10 +168,10 @@ public class IntentFactory { @SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling. @NonNull ArrayList<DisabledProviderData> disabledProviderDataList, - @NonNull ResultReceiver resultReceiver) { + @NonNull ResultReceiver resultReceiver, @UserIdInt int userId) { Intent intent = new Intent(); IntentCreationResult.Builder intentResultBuilder = new IntentCreationResult.Builder(intent); - setCredentialSelectorUiComponentName(context, intent, intentResultBuilder); + setCredentialSelectorUiComponentName(context, intent, intentResultBuilder, userId); intent.putParcelableArrayListExtra( ProviderData.EXTRA_DISABLED_PROVIDER_DATA_LIST, disabledProviderDataList); intent.putExtra(RequestInfo.EXTRA_REQUEST_INFO, requestInfo); @@ -175,9 +181,11 @@ public class IntentFactory { } private static void setCredentialSelectorUiComponentName(@NonNull Context context, - @NonNull Intent intent, @NonNull IntentCreationResult.Builder intentResultBuilder) { + @NonNull Intent intent, @NonNull IntentCreationResult.Builder intentResultBuilder, + @UserIdInt int userId) { if (configurableSelectorUiEnabled()) { - ComponentName componentName = getOemOverrideComponentName(context, intentResultBuilder); + ComponentName componentName = getOemOverrideComponentName(context, + intentResultBuilder, userId); ComponentName fallbackUiComponentName = null; try { @@ -210,7 +218,7 @@ public class IntentFactory { */ @Nullable private static ComponentName getOemOverrideComponentName(@NonNull Context context, - @NonNull IntentCreationResult.Builder intentResultBuilder) { + @NonNull IntentCreationResult.Builder intentResultBuilder, @UserIdInt int userId) { ComponentName result = null; String oemComponentString = Resources.getSystem() @@ -228,35 +236,43 @@ public class IntentFactory { if (oemComponentName != null) { try { intentResultBuilder.setOemUiPackageName(oemComponentName.getPackageName()); - ActivityInfo info = context.getPackageManager().getActivityInfo( - oemComponentName, - PackageManager.ComponentInfoFlags.of( - PackageManager.MATCH_SYSTEM_ONLY)); - boolean oemComponentEnabled = info.enabled; - int runtimeComponentEnabledState = context.getPackageManager() + ActivityInfo info; + if (android.credentials.flags.Flags.propagateUserContextForIntentCreation()) { + info = context.getPackageManager().getActivityInfo(oemComponentName, + PackageManager.ComponentInfoFlags.of( + PackageManager.MATCH_SYSTEM_ONLY)); + } else { + info = AppGlobals.getPackageManager().getActivityInfo( + oemComponentName, 0, userId); + } + boolean oemComponentEnabled = false; + if (info != null) { + oemComponentEnabled = info.enabled; + int runtimeComponentEnabledState = context.getPackageManager() .getComponentEnabledSetting(oemComponentName); - if (runtimeComponentEnabledState == PackageManager + if (runtimeComponentEnabledState == PackageManager .COMPONENT_ENABLED_STATE_ENABLED) { - oemComponentEnabled = true; - } else if (runtimeComponentEnabledState == PackageManager + oemComponentEnabled = true; + } else if (runtimeComponentEnabledState == PackageManager .COMPONENT_ENABLED_STATE_DISABLED) { oemComponentEnabled = false; - } - if (oemComponentEnabled && info.exported) { + } + if (oemComponentEnabled && info.exported) { intentResultBuilder.setOemUiUsageStatus(IntentCreationResult - .OemUiUsageStatus.SUCCESS); + .OemUiUsageStatus.SUCCESS); Slog.i(TAG, - "Found enabled oem CredMan UI component." - + oemComponentString); + "Found enabled oem CredMan UI component." + + oemComponentString); result = oemComponentName; - } else { - intentResultBuilder.setOemUiUsageStatus(IntentCreationResult - .OemUiUsageStatus.OEM_UI_CONFIG_SPECIFIED_FOUND_BUT_NOT_ENABLED); - Slog.i(TAG, - "Found enabled oem CredMan UI component but it was not " - + "enabled."); + } else { + intentResultBuilder.setOemUiUsageStatus(IntentCreationResult + .OemUiUsageStatus.OEM_UI_CONFIG_SPECIFIED_FOUND_BUT_NOT_ENABLED); + Slog.i(TAG, + "Found enabled oem CredMan UI component but it was not " + + "enabled."); + } } - } catch (PackageManager.NameNotFoundException e) { + } catch (RemoteException | PackageManager.NameNotFoundException e) { intentResultBuilder.setOemUiUsageStatus(IntentCreationResult.OemUiUsageStatus .OEM_UI_CONFIG_SPECIFIED_BUT_NOT_FOUND); Slog.i(TAG, "Unable to find oem CredMan UI component: " diff --git a/core/java/android/database/sqlite/SQLiteRawStatement.java b/core/java/android/database/sqlite/SQLiteRawStatement.java index c59d3cea0414..ce2334a8247a 100644 --- a/core/java/android/database/sqlite/SQLiteRawStatement.java +++ b/core/java/android/database/sqlite/SQLiteRawStatement.java @@ -533,11 +533,11 @@ public final class SQLiteRawStatement implements Closeable { } /** - * Return the number of columns in the current result row. + * Return the number of columns in the result set for the statement. * * @see <a href="http://sqlite.org/c3ref/column_count.html">sqlite3_column_count</a> * - * @return The number of columns in the result row. + * @return The number of columns in the result set. * @throws IllegalStateException if the statement is closed or this is a foreign thread. */ public int getResultColumnCount() { @@ -554,10 +554,16 @@ public final class SQLiteRawStatement implements Closeable { * * @see <a href="http://sqlite.org/c3ref/column_blob.html">sqlite3_column_type</a> * + * If the row has no data then a {@link SQLiteMisuseException} is thrown. This condition can + * occur the last call to {@link #step()} returned false or if {@link #step()} was not called + * before the statement was created or after the last call to {@link #reset()}. Note that + * {@link SQLiteMisuseException} may be thrown for other reasons. + * * @param columnIndex The index of a column in the result row. It is zero-based. * @return The type of the value in the column of the result row. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. * @throws SQLiteException if a native error occurs. */ @SQLiteDataType @@ -580,6 +586,7 @@ public final class SQLiteRawStatement implements Closeable { * @return The name of the column in the result row. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteOutOfMemoryException if the database cannot allocate memory for the name. */ @NonNull @@ -606,6 +613,7 @@ public final class SQLiteRawStatement implements Closeable { * @return The length, in bytes, of the value in the column. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteException if a native error occurs. */ public int getColumnLength(int columnIndex) { @@ -631,6 +639,7 @@ public final class SQLiteRawStatement implements Closeable { * @return The value of the column as a blob, or null if the column is NULL. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteException if a native error occurs. */ @Nullable @@ -664,6 +673,7 @@ public final class SQLiteRawStatement implements Closeable { * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws IllegalArgumentException if the buffer is too small for offset+length. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteException if a native error occurs. */ public int readColumnBlob(int columnIndex, @NonNull byte[] buffer, int offset, @@ -691,6 +701,7 @@ public final class SQLiteRawStatement implements Closeable { * @return The value of a column as a double. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteException if a native error occurs. */ public double getColumnDouble(int columnIndex) { @@ -715,6 +726,7 @@ public final class SQLiteRawStatement implements Closeable { * @return The value of the column as an int. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteException if a native error occurs. */ public int getColumnInt(int columnIndex) { @@ -739,6 +751,7 @@ public final class SQLiteRawStatement implements Closeable { * @return The value of the column as an long. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteException if a native error occurs. */ public long getColumnLong(int columnIndex) { @@ -763,6 +776,7 @@ public final class SQLiteRawStatement implements Closeable { * @return The value of the column as a string. * @throws IllegalStateException if the statement is closed or this is a foreign thread. * @throws SQLiteBindOrColumnIndexOutOfRangeException if the column is out of range. + * @throws SQLiteMisuseException if the row has no data. See {@link #getColumnType()}. * @throws SQLiteException if a native error occurs. */ @NonNull diff --git a/core/java/android/hardware/contexthub/HubEndpoint.java b/core/java/android/hardware/contexthub/HubEndpoint.java index 1f12bbf4d074..b251aa1abc0d 100644 --- a/core/java/android/hardware/contexthub/HubEndpoint.java +++ b/core/java/android/hardware/contexthub/HubEndpoint.java @@ -66,13 +66,14 @@ public class HubEndpoint { REASON_CLOSE_ENDPOINT_SESSION_REQUESTED, REASON_ENDPOINT_INVALID, REASON_ENDPOINT_STOPPED, + REASON_PERMISSION_DENIED, }) public @interface Reason {} /** Unclassified failure */ public static final int REASON_FAILURE = 0; - // The values 1 and 2 are reserved at the Context Hub HAL but not exposed to apps. + // The values 1-2 are reserved at the Context Hub HAL but not exposed to apps. /** The peer rejected the request to open this endpoint session. */ public static final int REASON_OPEN_ENDPOINT_SESSION_REQUEST_REJECTED = 3; @@ -83,6 +84,11 @@ public class HubEndpoint { /** The peer endpoint is invalid. */ public static final int REASON_ENDPOINT_INVALID = 5; + // The values 6-8 are reserved at the Context Hub HAL but not exposed to apps. + + /** The endpoint did not have the required permissions. */ + public static final int REASON_PERMISSION_DENIED = 9; + /** * The endpoint is now stopped. The app should retrieve the endpoint info using {@link * android.hardware.location.ContextHubManager#findEndpoints} or register updates through @@ -349,7 +355,10 @@ public class HubEndpoint { } try { IContextHubEndpoint serviceToken = - service.registerEndpoint(mPendingHubEndpointInfo, mServiceCallback); + service.registerEndpoint( + mPendingHubEndpointInfo, + mServiceCallback, + mPendingHubEndpointInfo.getTag()); mAssignedHubEndpointInfo = serviceToken.getAssignedHubEndpointInfo(); mServiceToken = serviceToken; } catch (RemoteException e) { diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java index af756b9217d3..47ef461dd53d 100644 --- a/core/java/android/hardware/input/KeyGestureEvent.java +++ b/core/java/android/hardware/input/KeyGestureEvent.java @@ -124,6 +124,7 @@ public final class KeyGestureEvent { public static final int KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION = 74; public static final int KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK = 75; public static final int KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW = 76; + public static final int KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB = 77; public static final int FLAG_CANCELLED = 1; @@ -215,7 +216,8 @@ public final class KeyGestureEvent { KEY_GESTURE_TYPE_MAGNIFIER_ZOOM_OUT, KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION, KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK, - KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW + KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW, + KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB }) @Retention(RetentionPolicy.SOURCE) public @interface KeyGestureType { @@ -788,6 +790,8 @@ public final class KeyGestureEvent { return "KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK"; case KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW: return "KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW"; + case KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: + return "KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB"; default: return Integer.toHexString(value); } diff --git a/core/java/android/hardware/location/IContextHubService.aidl b/core/java/android/hardware/location/IContextHubService.aidl index f14aadcab474..2a472375a00f 100644 --- a/core/java/android/hardware/location/IContextHubService.aidl +++ b/core/java/android/hardware/location/IContextHubService.aidl @@ -137,7 +137,7 @@ interface IContextHubService { // Register an endpoint with the context hub @EnforcePermission("ACCESS_CONTEXT_HUB") - IContextHubEndpoint registerEndpoint(in HubEndpointInfo pendingEndpointInfo, in IContextHubEndpointCallback callback); + IContextHubEndpoint registerEndpoint(in HubEndpointInfo pendingEndpointInfo, in IContextHubEndpointCallback callback, String packageName); // Register an endpoint discovery callback (id) @EnforcePermission("ACCESS_CONTEXT_HUB") diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 5f3c15d1842e..4c9e73c8b21f 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -3202,7 +3202,8 @@ public class InputMethodService extends AbstractInputMethodService { */ @FlaggedApi(Flags.FLAG_ADAPTIVE_HANDWRITING_BOUNDS) public final void setStylusHandwritingRegion(@NonNull Region handwritingRegion) { - if (handwritingRegion.equals(mLastHandwritingRegion)) { + final Region immutableHandwritingRegion = new Region(handwritingRegion); + if (immutableHandwritingRegion.equals(mLastHandwritingRegion)) { Log.v(TAG, "Failed to set setStylusHandwritingRegion():" + " same region set twice."); return; @@ -3210,10 +3211,10 @@ public class InputMethodService extends AbstractInputMethodService { if (DEBUG) { Log.d(TAG, "Setting new handwriting region for stylus handwriting " - + handwritingRegion + " from last " + mLastHandwritingRegion); + + immutableHandwritingRegion + " from last " + mLastHandwritingRegion); } - mPrivOps.setHandwritingTouchableRegion(handwritingRegion); - mLastHandwritingRegion = handwritingRegion; + mPrivOps.setHandwritingTouchableRegion(immutableHandwritingRegion); + mLastHandwritingRegion = immutableHandwritingRegion; } /** diff --git a/core/java/android/net/flags.aconfig b/core/java/android/net/flags.aconfig index 95b5f697969e..6799db3f7471 100644 --- a/core/java/android/net/flags.aconfig +++ b/core/java/android/net/flags.aconfig @@ -29,11 +29,3 @@ flag { } is_exported: true } - -flag { - name: "x509_extensions_certificate_transparency" - is_exported: true - namespace: "network_security" - description: "Flag to use checkServerTrusted to verify SCTs in OCSP and TLS Data" - bug: "319829948" -} diff --git a/core/java/android/net/http/X509TrustManagerExtensions.java b/core/java/android/net/http/X509TrustManagerExtensions.java index b44f75a585d5..3425b77be954 100644 --- a/core/java/android/net/http/X509TrustManagerExtensions.java +++ b/core/java/android/net/http/X509TrustManagerExtensions.java @@ -22,7 +22,7 @@ import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; -import android.net.platform.flags.Flags; +import android.security.Flags; import android.security.net.config.UserCertificateSource; import com.android.org.conscrypt.TrustManagerImpl; @@ -152,7 +152,7 @@ public class X509TrustManagerExtensions { * @throws IllegalArgumentException if the TrustManager is not compatible. * @return the properly ordered chain used for verification as a list of X509Certificates. */ - @FlaggedApi(Flags.FLAG_X509_EXTENSIONS_CERTIFICATE_TRANSPARENCY) + @FlaggedApi(Flags.FLAG_CERTIFICATE_TRANSPARENCY_CONFIGURATION) @NonNull public List<X509Certificate> checkServerTrusted( @SuppressLint("ArrayReturn") @NonNull X509Certificate[] chain, diff --git a/core/java/android/os/CombinedMessageQueue/MessageQueue.java b/core/java/android/os/CombinedMessageQueue/MessageQueue.java index ce56a4f63a75..230fa3fec930 100644 --- a/core/java/android/os/CombinedMessageQueue/MessageQueue.java +++ b/core/java/android/os/CombinedMessageQueue/MessageQueue.java @@ -1272,7 +1272,7 @@ public final class MessageQueue { return true; } - private Message legacyPeekOrPop(boolean peek) { + private Message legacyPeekOrPoll(boolean peek) { synchronized (this) { // Try to retrieve the next message. Return if found. final long now = SystemClock.uptimeMillis(); @@ -1331,7 +1331,7 @@ public final class MessageQueue { if (mUseConcurrent) { ret = nextMessage(true); } else { - ret = legacyPeekOrPop(true); + ret = legacyPeekOrPoll(true); } return ret != null ? ret.when : null; } @@ -1344,25 +1344,32 @@ public final class MessageQueue { */ @SuppressLint("VisiblySynchronized") // Legacy MessageQueue synchronizes on this @Nullable - Message popForTest() { + Message pollForTest() { throwIfNotTest(); if (mUseConcurrent) { return nextMessage(false); } else { - return legacyPeekOrPop(false); + return legacyPeekOrPoll(false); } } /** * @return true if we are blocked on a sync barrier + * + * Calls to this method must not be allowed to race with `next`. + * Specifically, the Looper thread must be paused before calling this method, + * and may not be resumed until after returning from this method. */ boolean isBlockedOnSyncBarrier() { throwIfNotTest(); if (mUseConcurrent) { + // Call nextMessage to get the stack drained into our priority queues + nextMessage(true); + Iterator<MessageNode> queueIter = mPriorityQueue.iterator(); MessageNode queueNode = iterateNext(queueIter); - if (queueNode.isBarrier()) { + if (queueNode != null && queueNode.isBarrier()) { long now = SystemClock.uptimeMillis(); /* Look for a deliverable async node. If one exists we are not blocked. */ @@ -1375,14 +1382,12 @@ public final class MessageQueue { * Look for a deliverable sync node. In this case, if one exists we are blocked * since the barrier prevents delivery of the Message. */ - while (queueNode.isBarrier()) { + while (queueNode != null && queueNode.isBarrier()) { queueNode = iterateNext(queueIter); } if (queueNode != null && now >= queueNode.getWhen()) { return true; } - - return false; } } else { Message msg = mMessages; @@ -1409,10 +1414,8 @@ public final class MessageQueue { if (iter != null && now >= iter.when) { return true; } - return false; } } - /* No barrier was found. */ return false; } diff --git a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java index 576c4cc5b442..d7d8e4199b33 100644 --- a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java +++ b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java @@ -19,6 +19,7 @@ package android.os; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.TestApi; import android.app.ActivityThread; import android.app.Instrumentation; @@ -784,7 +785,7 @@ public final class MessageQueue { mMessageDirectlyQueued = false; nativePollOnce(ptr, mNextPollTimeoutMillis); - Message msg = nextMessage(); + Message msg = nextMessage(false); if (msg != null) { msg.markInUse(); return msg; @@ -1087,7 +1088,6 @@ public final class MessageQueue { * * Caller must ensure that this doesn't race 'next' from the Looper thread. */ - @SuppressLint("VisiblySynchronized") // Legacy MessageQueue synchronizes on this Long peekWhenForTest() { throwIfNotTest(); Message ret = nextMessage(true); @@ -1100,22 +1100,29 @@ public final class MessageQueue { * * Caller must ensure that this doesn't race 'next' from the Looper thread. */ - @SuppressLint("VisiblySynchronized") // Legacy MessageQueue synchronizes on this @Nullable - Message popForTest() { + Message pollForTest() { throwIfNotTest(); return nextMessage(false); } /** * @return true if we are blocked on a sync barrier + * + * Calls to this method must not be allowed to race with `next`. + * Specifically, the Looper thread must be paused before calling this method, + * and may not be resumed until after returning from this method. */ boolean isBlockedOnSyncBarrier() { throwIfNotTest(); + + // Call nextMessage to get the stack drained into our priority queues + nextMessage(true); + Iterator<MessageNode> queueIter = mPriorityQueue.iterator(); MessageNode queueNode = iterateNext(queueIter); - if (queueNode.isBarrier()) { + if (queueNode != null && queueNode.isBarrier()) { long now = SystemClock.uptimeMillis(); /* Look for a deliverable async node. If one exists we are not blocked. */ @@ -1128,15 +1135,14 @@ public final class MessageQueue { * Look for a deliverable sync node. In this case, if one exists we are blocked * since the barrier prevents delivery of the Message. */ - while (queueNode.isBarrier()) { + while (queueNode != null && queueNode.isBarrier()) { queueNode = iterateNext(queueIter); } if (queueNode != null && now >= queueNode.getWhen()) { return true; } - - return false; } + return false; } private StateNode getStateNode(StackNode node) { @@ -1193,7 +1199,7 @@ public final class MessageQueue { MessageNode p = (MessageNode) top; while (true) { - if (compare.compareMessage(p.mMessage, h, what, object, r, when)) { + if (compare.compareMessage(p, h, what, object, r, when)) { found = true; if (DEBUG) { Log.w(TAG, "stackHasMessages node matches"); @@ -1238,7 +1244,7 @@ public final class MessageQueue { while (iterator.hasNext()) { MessageNode msg = iterator.next(); - if (compare.compareMessage(msg.mMessage, h, what, object, r, when)) { + if (compare.compareMessage(msg, h, what, object, r, when)) { if (removeMatches) { found = true; if (queue.remove(msg)) { diff --git a/core/java/android/os/EventLogTags.logtags b/core/java/android/os/EventLogTags.logtags index b143a7443066..f57aad00e591 100644 --- a/core/java/android/os/EventLogTags.logtags +++ b/core/java/android/os/EventLogTags.logtags @@ -1,4 +1,4 @@ -# See system/core/logcat/event.logtags for a description of the format of this file. +# See system/logging/logcat/event.logtags for a description of the format of this file. option java_package android.os diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java index d0828c384664..eaecd34b9d75 100644 --- a/core/java/android/os/Handler.java +++ b/core/java/android/os/Handler.java @@ -20,6 +20,7 @@ import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.util.Log; import android.util.Printer; @@ -839,6 +840,7 @@ public class Handler { *@hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @TestApi @FlaggedApi(android.os.Flags.FLAG_MAINLINE_VCN_PLATFORM_API) public final void removeEqualMessages(int what, @Nullable Object object) { mQueue.removeEqualMessages(this, what, disallowNullArgumentIfShared(object)); @@ -872,6 +874,7 @@ public class Handler { *@hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @TestApi @FlaggedApi(android.os.Flags.FLAG_MAINLINE_VCN_PLATFORM_API) public final void removeCallbacksAndEqualMessages(@Nullable Object token) { mQueue.removeCallbacksAndEqualMessages(this, disallowNullArgumentIfShared(token)); @@ -889,6 +892,7 @@ public class Handler { * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @TestApi @FlaggedApi(android.os.Flags.FLAG_MAINLINE_VCN_PLATFORM_API) public final boolean hasMessagesOrCallbacks() { return mQueue.hasMessages(this); diff --git a/core/java/android/os/IHintManager.aidl b/core/java/android/os/IHintManager.aidl index 4a14a8d0faf8..56a089aff78a 100644 --- a/core/java/android/os/IHintManager.aidl +++ b/core/java/android/os/IHintManager.aidl @@ -21,11 +21,13 @@ import android.os.CpuHeadroomParamsInternal; import android.os.GpuHeadroomParamsInternal; import android.os.IHintSession; import android.os.SessionCreationConfig; -import android.hardware.power.CpuHeadroomResult; + import android.hardware.power.ChannelConfig; +import android.hardware.power.CpuHeadroomResult; import android.hardware.power.GpuHeadroomResult; import android.hardware.power.SessionConfig; import android.hardware.power.SessionTag; +import android.hardware.power.SupportInfo; /** {@hide} */ interface IHintManager { @@ -40,11 +42,6 @@ interface IHintManager { IHintSession createHintSessionWithConfig(in IBinder token, in SessionTag tag, in SessionCreationConfig creationConfig, out SessionConfig config); - /** - * Get preferred rate limit in nanoseconds. - */ - long getHintSessionPreferredRate(); - void setHintSessionThreads(in IHintSession hintSession, in int[] tids); int[] getHintSessionThreadIds(in IHintSession hintSession); @@ -61,13 +58,28 @@ interface IHintManager { long getGpuHeadroomMinIntervalMillis(); /** - * Get Maximum number of graphics pipeline threads allowed per-app. - */ - int getMaxGraphicsPipelineThreadsCount(); - - /** * Used by the JNI to pass an interface to the SessionManager; * for internal use only. */ oneway void passSessionManagerBinder(in IBinder sessionManager); + + parcelable HintManagerClientData { + int powerHalVersion; + int maxGraphicsPipelineThreads; + long preferredRateNanos; + SupportInfo supportInfo; + } + + interface IHintManagerClient { + /** + * Returns FMQ channel information for the caller, which it associates to the callback binder lifespan. + */ + oneway void receiveChannelConfig(in ChannelConfig config); + } + + /** + * Set up an ADPF client, receiving a remote client binder interface and + * passing back a bundle of support and configuration information. + */ + HintManagerClientData registerClient(in IHintManagerClient client); } diff --git a/core/java/android/os/LegacyMessageQueue/MessageQueue.java b/core/java/android/os/LegacyMessageQueue/MessageQueue.java index 10d090444c59..c0333e914b4d 100644 --- a/core/java/android/os/LegacyMessageQueue/MessageQueue.java +++ b/core/java/android/os/LegacyMessageQueue/MessageQueue.java @@ -740,7 +740,7 @@ public final class MessageQueue { return true; } - private Message legacyPeekOrPop(boolean peek) { + private Message legacyPeekOrPoll(boolean peek) { synchronized (this) { // Try to retrieve the next message. Return if found. final long now = SystemClock.uptimeMillis(); @@ -795,7 +795,7 @@ public final class MessageQueue { @SuppressLint("VisiblySynchronized") // Legacy MessageQueue synchronizes on this Long peekWhenForTest() { throwIfNotTest(); - Message ret = legacyPeekOrPop(true); + Message ret = legacyPeekOrPoll(true); return ret != null ? ret.when : null; } @@ -807,13 +807,17 @@ public final class MessageQueue { */ @SuppressLint("VisiblySynchronized") // Legacy MessageQueue synchronizes on this @Nullable - Message popForTest() { + Message pollForTest() { throwIfNotTest(); - return legacyPeekOrPop(false); + return legacyPeekOrPoll(false); } /** * @return true if we are blocked on a sync barrier + * + * Calls to this method must not be allowed to race with `next`. + * Specifically, the Looper thread must be paused before calling this method, + * and may not be resumed until after returning from this method. */ boolean isBlockedOnSyncBarrier() { throwIfNotTest(); diff --git a/core/java/android/os/Looper.java b/core/java/android/os/Looper.java index ddf2b61324ad..012590510714 100644 --- a/core/java/android/os/Looper.java +++ b/core/java/android/os/Looper.java @@ -332,16 +332,55 @@ public final class Looper { return -1; } + private static int getThreadGroup() { + int threadGroup = Process.THREAD_GROUP_DEFAULT; + + if (!Process.isIsolated()) { + threadGroup = Process.getProcessGroup(Process.myTid()); + } + return threadGroup; + } + + private static String threadGroupToString(int threadGroup) { + switch (threadGroup) { + case Process.THREAD_GROUP_BACKGROUND: + return "BACKGROUND"; + case Process.THREAD_GROUP_FOREGROUND: + return "FOREGROUND"; + case Process.THREAD_GROUP_SYSTEM: + return "SYSTEM"; + case Process.THREAD_GROUP_AUDIO_APP: + return "AUDIO_APP"; + case Process.THREAD_GROUP_AUDIO_SYS: + return "AUDIO_SYS"; + case Process.THREAD_GROUP_TOP_APP: + return "TOP_APP"; + case Process.THREAD_GROUP_RT_APP: + return "RT_APP"; + case Process.THREAD_GROUP_RESTRICTED: + return "RESTRICTED"; + default: + return "UNKNOWN"; + } + } + private static boolean showSlowLog(long threshold, long measureStart, long measureEnd, String what, Message msg) { final long actualTime = measureEnd - measureStart; if (actualTime < threshold) { return false; } + + String name = Process.myProcessName(); + String threadGroup = threadGroupToString(getThreadGroup()); + boolean isMain = myLooper() == getMainLooper(); + // For slow delivery, the current message isn't really important, but log it anyway. Slog.w(TAG, "Slow " + what + " took " + actualTime + "ms " - + Thread.currentThread().getName() + " h=" - + msg.target.getClass().getName() + " c=" + msg.callback + " m=" + msg.what); + + Thread.currentThread().getName() + " app=" + name + + " main=" + isMain + " group=" + threadGroup + + " h=" + msg.target.getClass().getName() + " c=" + msg.callback + + " m=" + msg.what); return true; } diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS index 8d353384f1e2..f3bb51490f20 100644 --- a/core/java/android/os/OWNERS +++ b/core/java/android/os/OWNERS @@ -115,13 +115,20 @@ per-file ProfilingServiceManager.java = file:/PERFORMANCE_OWNERS # Performance per-file IpcDataCache.java = file:/PERFORMANCE_OWNERS +# Processes, threads, and scheduling +per-file Process.java = file:/PERFORMANCE_OWNERS + # Memory per-file OomKillRecord.java = file:/MEMORY_OWNERS # MessageQueue and related classes per-file MessageQueue.java = mfasheh@google.com, shayba@google.com per-file Message.java = mfasheh@google.com, shayba@google.com +per-file Looper.java = mfasheh@google.com, shayba@google.com per-file TestLooperManager.java = mfasheh@google.com, shayba@google.com +per-file Handler.java = mfasheh@google.com, shayba@google.com +per-file HandlerThread.java = mfasheh@google.com, shayba@google.com +per-file HandlerExecutor.java = mfasheh@google.com, shayba@google.com # Stats per-file IStatsBootstrapAtomService.aidl = file:/services/core/java/com/android/server/stats/OWNERS diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index e7282435ad46..907d96834857 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -553,10 +553,9 @@ public class Process { * Foreground thread group - All threads in * this group are scheduled with a normal share of the CPU. * Value is same as constant SP_FOREGROUND of enum SchedPolicy. - * Not used at this level. * @hide **/ - private static final int THREAD_GROUP_FOREGROUND = 1; + public static final int THREAD_GROUP_FOREGROUND = 1; /** * System thread group. @@ -1315,19 +1314,6 @@ public class Process { } /** - * Adjust the swappiness level for a process. - * - * @param pid The process identifier to set. - * @param is_increased Whether swappiness should be increased or default. - * - * @return Returns true if the underlying system supports this - * feature, else false. - * - * {@hide} - */ - public static final native boolean setSwappiness(int pid, boolean is_increased); - - /** * Change this process's argv[0] parameter. This can be useful to show * more descriptive information in things like the 'ps' command. * diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java index 49b696d95723..7ea521ec5dd4 100644 --- a/core/java/android/os/ServiceManagerNative.java +++ b/core/java/android/os/ServiceManagerNative.java @@ -50,7 +50,8 @@ public final class ServiceManagerNative { class ServiceManagerProxy implements IServiceManager { public ServiceManagerProxy(IBinder remote) { mRemote = remote; - mServiceManager = IServiceManager.Stub.asInterface(this.getNativeServiceManager()); + mServiceManager = IServiceManager.Stub.asInterface( + Binder.allowBlocking(this.getNativeServiceManager())); } public IBinder asBinder() { diff --git a/core/java/android/os/TestLooperManager.java b/core/java/android/os/TestLooperManager.java index 6431f3ce73f3..e2169925fdd3 100644 --- a/core/java/android/os/TestLooperManager.java +++ b/core/java/android/os/TestLooperManager.java @@ -95,8 +95,8 @@ public class TestLooperManager { } /** - * Returns the next message that should be executed by this queue, and removes it from the - * queue. If the queue is empty or no messages are deliverable, returns null. + * Retrieves and removes the next message that should be executed by this queue. + * If the queue is empty or no messages are deliverable, returns null. * This method never blocks. * * <p>Callers should always call {@link #recycle(Message)} on the message when all interactions @@ -104,15 +104,19 @@ public class TestLooperManager { */ @FlaggedApi(Flags.FLAG_MESSAGE_QUEUE_TESTABILITY) @Nullable - public Message pop() { + public Message poll() { checkReleased(); - return mQueue.popForTest(); + return mQueue.pollForTest(); } /** - * Returns the values of {@link Message#when} of the next message that should be executed by - * this queue. If the queue is empty or no messages are deliverable, returns null. + * Retrieves, but does not remove, the values of {@link Message#when} of next message that + * should be executed by this queue. + * If the queue is empty or no messages are deliverable, returns null. * This method never blocks. + * + * <p>Callers should always call {@link #recycle(Message)} on the message when all interactions + * with it have completed. */ @FlaggedApi(Flags.FLAG_MESSAGE_QUEUE_TESTABILITY) @SuppressWarnings("AutoBoxing") // box the primitive long, or return null to indicate no value diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 7e73a5d04866..b9f2cfcd8ca8 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -6501,7 +6501,11 @@ public class UserManager { * @hide */ public static final void invalidateCacheOnUserDataChanged() { - if (android.multiuser.Flags.cacheProfilesReadOnly()) { + if (android.multiuser.Flags.cacheProfilesReadOnly() + || android.multiuser.Flags.cacheUserInfoReadOnly()) { + // TODO(b/383175685): Rename the invalidation call to make it clearer that it + // invalidates the caches for both getProfiles and getUserInfo (since they both use the + // same user_manager_user_data CachedProperty.api). UserManagerCache.invalidateProfiles(); } } diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig index aacc6e2a3156..af96ccfee787 100644 --- a/core/java/android/permission/flags.aconfig +++ b/core/java/android/permission/flags.aconfig @@ -57,7 +57,7 @@ flag { is_exported: true is_fixed_read_only: true namespace: "permissions" - description: "enable enhanced confirmation incall apis" + description: "DEPRECATED, does not gate any apis" bug: "364535720" } diff --git a/core/java/android/provider/flags.aconfig b/core/java/android/provider/flags.aconfig index fff53637485b..a80be531239b 100644 --- a/core/java/android/provider/flags.aconfig +++ b/core/java/android/provider/flags.aconfig @@ -24,14 +24,6 @@ flag { bug: "290696572" } -flag { - name: "backup_tasks_settings_screen" - is_exported: true - namespace: "backstage_power" - description: "Add a new settings page for the RUN_BACKUP_JOBS permission." - bug: "320563660" -} - # OWNER = tgunn TARGET=25Q1 flag { name: "allow_config_maximum_call_log_entries_per_sim" diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig index 34bae46b484c..ebb6fb451699 100644 --- a/core/java/android/security/flags.aconfig +++ b/core/java/android/security/flags.aconfig @@ -137,4 +137,12 @@ flag { description: "Feature flag for Secure Lockdown feature" bug: "373422357" is_exported: true +} + +flag { + name: "subscribe_to_keyguard_locked_state_perm_priv_flag" + namespace: "psap_ai" + description: "Feature flag to add the privileged flag to the SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE permission" + bug: "380120712" + is_fixed_read_only: true }
\ No newline at end of file diff --git a/core/java/android/service/autofill/augmented/FillWindow.java b/core/java/android/service/autofill/augmented/FillWindow.java index 0ce040d7f862..d42ec7c71830 100644 --- a/core/java/android/service/autofill/augmented/FillWindow.java +++ b/core/java/android/service/autofill/augmented/FillWindow.java @@ -17,6 +17,7 @@ package android.service.autofill.augmented; import static android.service.autofill.augmented.AugmentedAutofillService.sDebug; import static android.service.autofill.augmented.AugmentedAutofillService.sVerbose; +import static android.service.autofill.Flags.addAccessibilityTitleForAugmentedAutofillDropdown; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; @@ -36,6 +37,7 @@ import android.view.WindowManager; import android.view.autofill.IAutofillWindowPresenter; import com.android.internal.annotations.GuardedBy; +import com.android.internal.R; import dalvik.system.CloseGuard; @@ -208,6 +210,12 @@ public final class FillWindow implements AutoCloseable { if (mWm != null && mFillView != null) { try { p.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; + if (addAccessibilityTitleForAugmentedAutofillDropdown()) { + p.accessibilityTitle = + mFillView + .getContext() + .getString(R.string.autofill_picker_accessibility_title); + } if (!mShowing) { mWm.addView(mFillView, p); mShowing = true; diff --git a/services/core/java/com/android/server/notification/RateEstimator.java b/core/java/android/service/notification/RateEstimator.java index eda96ac84b16..04789c18ffe4 100644 --- a/services/core/java/com/android/server/notification/RateEstimator.java +++ b/core/java/android/service/notification/RateEstimator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -11,10 +11,10 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License + * limitations under the License. */ -package com.android.server.notification; +package android.service.notification; /** @@ -22,7 +22,7 @@ package com.android.server.notification; * * {@hide} */ -class RateEstimator { +public class RateEstimator { private static final double RATE_ALPHA = 0.7; private static final double MINIMUM_DT = 0.0005; diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java index cb72b976c784..6dc82c40ddc5 100644 --- a/core/java/android/text/TextUtils.java +++ b/core/java/android/text/TextUtils.java @@ -678,7 +678,7 @@ public class TextUtils { * @return true if a and b are equal */ @android.ravenwood.annotation.RavenwoodKeep - public static boolean equals(CharSequence a, CharSequence b) { + public static boolean equals(@Nullable CharSequence a, @Nullable CharSequence b) { if (a == b) return true; int length; if (a != null && b != null && (length = a.length()) == b.length()) { diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 802bddd76e30..1ea226b013d6 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -19,6 +19,7 @@ package android.view; import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_MODE; import static android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS; import static android.hardware.flags.Flags.FLAG_OVERLAYPROPERTIES_CLASS_API; +import static android.util.TypedValue.COMPLEX_UNIT_DIP; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_GET_SUPPORTED_REFRESH_RATES; import static com.android.server.display.feature.flags.Flags.FLAG_HIGHEST_HDR_SDR_RATIO_API; @@ -58,6 +59,7 @@ import android.os.SystemClock; import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.Log; +import android.util.TypedValue; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1048,6 +1050,19 @@ public final class Display { } /** + * Returns the smallest size of the display in dp + * @hide + */ + public float getMinSizeDimensionDp() { + synchronized (mLock) { + updateDisplayInfoLocked(); + mDisplayInfo.getAppMetrics(mTempMetrics); + return TypedValue.deriveDimension(COMPLEX_UNIT_DIP, + Math.min(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight), mTempMetrics); + } + } + + /** * @deprecated Use {@link WindowMetrics#getBounds#width()} instead. */ @Deprecated diff --git a/core/java/android/view/EventLogTags.logtags b/core/java/android/view/EventLogTags.logtags index f3792930647a..95894fa32d6b 100644 --- a/core/java/android/view/EventLogTags.logtags +++ b/core/java/android/view/EventLogTags.logtags @@ -1,4 +1,4 @@ -# See system/core/logcat/event.logtags for a description of the format of this file. +# See system/logging/logcat/event.logtags for a description of the format of this file. option java_package android.view @@ -35,7 +35,7 @@ option java_package android.view # 6: Percent # Default value for data of type int/long is 2 (bytes). # -# See system/core/logcat/event.logtags for the master copy of the tags. +# See system/logging/logcat/event.logtags for the master copy of the tags. # 32000 - 32999 reserved for input method framework # IME animation is started. diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index d15b0f518f83..d13f0e21bf80 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -28277,28 +28277,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags |= PFLAG_FORCE_LAYOUT; mPrivateFlags |= PFLAG_INVALIDATED; - if (mParent != null) { - if (!mParent.isLayoutRequested()) { - mParent.requestLayout(); - } else { - clearMeasureCacheOfAncestors(); - } + if (mParent != null && !mParent.isLayoutRequested()) { + mParent.requestLayout(); } if (mAttachInfo != null && mAttachInfo.mViewRequestingLayout == this) { mAttachInfo.mViewRequestingLayout = null; } } - private void clearMeasureCacheOfAncestors() { - ViewParent parent = mParent; - while (parent instanceof View view) { - if (view.mMeasureCache != null) { - view.mMeasureCache.clear(); - } - parent = view.mParent; - } - } - /** * Forces this view to be laid out during the next layout pass. * This method does not call requestLayout() or forceLayout() @@ -28654,10 +28640,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ @RemotableViewMethod public void setMinimumHeight(int minHeight) { - if (mMinHeight != minHeight) { - mMinHeight = minHeight; - requestLayout(); - } + mMinHeight = minHeight; + requestLayout(); } /** @@ -28687,10 +28671,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ @RemotableViewMethod public void setMinimumWidth(int minWidth) { - if (mMinWidth != minWidth) { - mMinWidth = minWidth; - requestLayout(); - } + mMinWidth = minWidth; + requestLayout(); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1596b85bb461..c1b92ee3f74e 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -17,6 +17,7 @@ package android.view; import static android.adpf.Flags.adpfViewrootimplActionDownBoost; +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.content.pm.ActivityInfo.OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS; import static android.graphics.HardwareRenderer.SYNC_CONTEXT_IS_STOPPED; @@ -7977,8 +7978,9 @@ public final class ViewRootImpl implements ViewParent, } private boolean moveFocusToAdjacentWindow(@FocusDirection int direction) { - if (getConfiguration().windowConfiguration.getWindowingMode() - != WINDOWING_MODE_MULTI_WINDOW) { + final int windowingMode = getConfiguration().windowConfiguration.getWindowingMode(); + if (windowingMode != WINDOWING_MODE_MULTI_WINDOW + && windowingMode != WINDOWING_MODE_FREEFORM) { return false; } try { diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 6d89f3d89077..f82e5f984f5d 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -948,7 +948,7 @@ public final class InputMethodManager { // requestedVisibleTypes of WindowInsetsController by hiding the IME final var statsToken = ImeTracker.forLogging().onStart( ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_CLIENT, - SoftInputShowHideReason.REASON_HIDE_WINDOW_LOST_FOCUS, + SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS, false /* fromUser */); if (DEBUG) { Log.d(TAG, "onWindowLostFocus, hiding IME because " diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 9c2833b91a2b..9fe3fd6ddc1a 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -20,6 +20,7 @@ import static android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL; import static android.appwidget.flags.Flags.FLAG_REMOTE_VIEWS_PROTO; import static android.appwidget.flags.Flags.drawDataParcel; import static android.appwidget.flags.Flags.remoteAdapterConversion; +import static android.content.res.Flags.FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO; import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8; import static android.util.proto.ProtoInputStream.NO_MORE_FIELDS; import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR; @@ -8698,6 +8699,7 @@ public class RemoteViews implements Parcelable, Filter { * * @hide */ + @FlaggedApi(FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO) @Nullable public static ColorResources createWithOverlay(Context context, SparseIntArray colorMapping) { diff --git a/core/java/android/window/TaskSnapshot.java b/core/java/android/window/TaskSnapshot.java index a37bef80ff04..53c64bd6e664 100644 --- a/core/java/android/window/TaskSnapshot.java +++ b/core/java/android/window/TaskSnapshot.java @@ -77,6 +77,8 @@ public class TaskSnapshot implements Parcelable { private final ColorSpace mColorSpace; private int mInternalReferences; + /** Keep in cache, doesn't need reference. */ + public static final int REFERENCE_NONE = 0; /** This snapshot object is being broadcast. */ public static final int REFERENCE_BROADCAST = 1; /** This snapshot object is in the cache. */ @@ -85,11 +87,16 @@ public class TaskSnapshot implements Parcelable { public static final int REFERENCE_PERSIST = 1 << 2; /** This snapshot object is being used for content suggestion. */ public static final int REFERENCE_CONTENT_SUGGESTION = 1 << 3; + /** This snapshot object will be passing to external process. Keep the snapshot reference after + * writeToParcel*/ + public static final int REFERENCE_WRITE_TO_PARCEL = 1 << 4; @IntDef(flag = true, prefix = { "REFERENCE_" }, value = { + REFERENCE_NONE, REFERENCE_BROADCAST, REFERENCE_CACHE, REFERENCE_PERSIST, - REFERENCE_CONTENT_SUGGESTION + REFERENCE_CONTENT_SUGGESTION, + REFERENCE_WRITE_TO_PARCEL }) @Retention(RetentionPolicy.SOURCE) public @interface ReferenceFlags {} @@ -309,6 +316,11 @@ public class TaskSnapshot implements Parcelable { dest.writeBoolean(mIsTranslucent); dest.writeBoolean(mHasImeSurface); dest.writeInt(mUiMode); + synchronized (this) { + if ((mInternalReferences & REFERENCE_WRITE_TO_PARCEL) != 0) { + removeReference(REFERENCE_WRITE_TO_PARCEL); + } + } } @Override diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java index a88a17283482..c8001198bdf6 100644 --- a/core/java/android/window/WindowContainerTransaction.java +++ b/core/java/android/window/WindowContainerTransaction.java @@ -486,7 +486,7 @@ public final class WindowContainerTransaction implements Parcelable { } /** - * Sets to containers adjacent to each other. Containers below two visible adjacent roots will + * Sets two containers adjacent to each other. Containers below two visible adjacent roots will * be made invisible. This currently only applies to TaskFragment containers created by * organizer. * @param root1 the first root. @@ -495,9 +495,64 @@ public final class WindowContainerTransaction implements Parcelable { @NonNull public WindowContainerTransaction setAdjacentRoots( @NonNull WindowContainerToken root1, @NonNull WindowContainerToken root2) { - mHierarchyOps.add(HierarchyOp.createForAdjacentRoots( - root1.asBinder(), - root2.asBinder())); + if (!Flags.allowMultipleAdjacentTaskFragments()) { + mHierarchyOps.add(HierarchyOp.createForAdjacentRoots( + root1.asBinder(), + root2.asBinder())); + return this; + } + return setAdjacentRootSet(root1, root2); + } + + /** + * Sets multiple containers adjacent to each other. Containers below the visible adjacent roots + * will be made invisible. This currently only applies to Task containers created by organizer. + * + * To remove one container from the adjacent roots, one can call {@link #clearAdjacentRoots} + * with the target container. + * To remove all containers from the adjacent roots, one much call {@link #clearAdjacentRoots} + * on each container if there were more than two containers in the set. + * + * For non-Task TaskFragment, use {@link #setAdjacentTaskFragments} instead. + * + * @param roots the Tasks that should be adjacent to each other. + * @throws IllegalArgumentException if roots have size < 2. + * @hide // TODO(b/373709676) Rename to setAdjacentRoots and update CTS. + */ + @NonNull + public WindowContainerTransaction setAdjacentRootSet( + @NonNull WindowContainerToken... roots) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + throw new IllegalArgumentException("allowMultipleAdjacentTaskFragments is not enabled." + + " Use #setAdjacentRoots instead."); + } + if (roots.length < 2) { + throw new IllegalArgumentException("setAdjacentRootSet must have size >= 2"); + } + final IBinder[] rootTokens = new IBinder[roots.length]; + for (int i = 0; i < roots.length; i++) { + rootTokens[i] = roots[i].asBinder(); + } + mHierarchyOps.add( + new HierarchyOp.Builder(HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS) + .setContainers(rootTokens) + .build()); + return this; + } + + /** + * Clears container adjacent. + * If {@link #setAdjacentRootSet} is called with more than 2 roots, calling this will only + * remove the given root from the adjacent set. The rest of roots will stay adjacent to each + * other. + * + * @param root the root container to clear the adjacent roots for. + * @hide + */ + @NonNull + public WindowContainerTransaction clearAdjacentRoots( + @NonNull WindowContainerToken root) { + mHierarchyOps.add(HierarchyOp.createForClearAdjacentRoots(root.asBinder())); return this; } @@ -967,18 +1022,6 @@ public final class WindowContainerTransaction implements Parcelable { } /** - * Clears container adjacent. - * @param root the root container to clear the adjacent roots for. - * @hide - */ - @NonNull - public WindowContainerTransaction clearAdjacentRoots( - @NonNull WindowContainerToken root) { - mHierarchyOps.add(HierarchyOp.createForClearAdjacentRoots(root.asBinder())); - return this; - } - - /** * Sets/removes the reparent leaf task flag for this {@code windowContainer}. * When this is set, the server side will try to reparent the leaf task to task display area * if there is an existing activity in history during the activity launch. This operation only @@ -1520,6 +1563,9 @@ public final class WindowContainerTransaction implements Parcelable { @Nullable private IBinder mContainer; + @Nullable + private IBinder[] mContainers; + // If this is same as mContainer, then only change position, don't reparent. @Nullable private IBinder mReparent; @@ -1704,6 +1750,7 @@ public final class WindowContainerTransaction implements Parcelable { public HierarchyOp(@NonNull HierarchyOp copy) { mType = copy.mType; mContainer = copy.mContainer; + mContainers = copy.mContainers; mBounds = copy.mBounds; mIncludingParents = copy.mIncludingParents; mReparent = copy.mReparent; @@ -1729,6 +1776,7 @@ public final class WindowContainerTransaction implements Parcelable { protected HierarchyOp(Parcel in) { mType = in.readInt(); mContainer = in.readStrongBinder(); + mContainers = in.createBinderArray(); mBounds = in.readTypedObject(Rect.CREATOR); mIncludingParents = in.readBoolean(); mReparent = in.readStrongBinder(); @@ -1780,6 +1828,13 @@ public final class WindowContainerTransaction implements Parcelable { } @NonNull + public IBinder[] getContainers() { + return mContainers; + } + + /** @deprecated b/373709676 replace with {@link #getContainers()}. */ + @Deprecated + @NonNull public IBinder getAdjacentRoot() { return mReparent; } @@ -1869,7 +1924,7 @@ public final class WindowContainerTransaction implements Parcelable { case HIERARCHY_OP_TYPE_REORDER: return "reorder"; case HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT: return "childrenTasksReparent"; case HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT: return "setLaunchRoot"; - case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS: return "setAdjacentRoot"; + case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS: return "setAdjacentRoots"; case HIERARCHY_OP_TYPE_LAUNCH_TASK: return "launchTask"; case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT: return "setAdjacentFlagRoot"; case HIERARCHY_OP_TYPE_SET_DISABLE_LAUNCH_ADJACENT: @@ -1883,7 +1938,7 @@ public final class WindowContainerTransaction implements Parcelable { case HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP: return "setAlwaysOnTop"; case HIERARCHY_OP_TYPE_REMOVE_TASK: return "removeTask"; case HIERARCHY_OP_TYPE_FINISH_ACTIVITY: return "finishActivity"; - case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: return "clearAdjacentRoot"; + case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: return "clearAdjacentRoots"; case HIERARCHY_OP_TYPE_SET_REPARENT_LEAF_TASK_IF_RELAUNCH: return "setReparentLeafTaskIfRelaunch"; case HIERARCHY_OP_TYPE_ADD_TASK_FRAGMENT_OPERATION: @@ -1923,8 +1978,18 @@ public final class WindowContainerTransaction implements Parcelable { sb.append(mContainer).append(" to ").append(mToTop ? "top" : "bottom"); break; case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS: - sb.append("container=").append(mContainer) - .append(" adjacentRoot=").append(mReparent); + if (Flags.allowMultipleAdjacentTaskFragments()) { + for (IBinder container : mContainers) { + if (container == mContainers[0]) { + sb.append("adjacentRoots=").append(container); + } else { + sb.append(", ").append(container); + } + } + } else { + sb.append("container=").append(mContainer) + .append(" adjacentRoot=").append(mReparent); + } break; case HIERARCHY_OP_TYPE_LAUNCH_TASK: sb.append(mLaunchOptions); @@ -1997,6 +2062,7 @@ public final class WindowContainerTransaction implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mType); dest.writeStrongBinder(mContainer); + dest.writeBinderArray(mContainers); dest.writeTypedObject(mBounds, flags); dest.writeBoolean(mIncludingParents); dest.writeStrongBinder(mReparent); @@ -2044,6 +2110,9 @@ public final class WindowContainerTransaction implements Parcelable { private IBinder mContainer; @Nullable + private IBinder[] mContainers; + + @Nullable private IBinder mReparent; @Nullable @@ -2104,6 +2173,11 @@ public final class WindowContainerTransaction implements Parcelable { return this; } + Builder setContainers(@Nullable IBinder[] containers) { + mContainers = containers; + return this; + } + Builder setReparentContainer(@Nullable IBinder reparentContainer) { mReparent = reparentContainer; return this; @@ -2209,6 +2283,7 @@ public final class WindowContainerTransaction implements Parcelable { HierarchyOp build() { final HierarchyOp hierarchyOp = new HierarchyOp(mType); hierarchyOp.mContainer = mContainer; + hierarchyOp.mContainers = mContainers; hierarchyOp.mReparent = mReparent; hierarchyOp.mWindowingModes = mWindowingModes != null ? Arrays.copyOf(mWindowingModes, mWindowingModes.length) diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig index a04071a5997b..6caa20e29c17 100644 --- a/core/java/android/window/flags/lse_desktop_experience.aconfig +++ b/core/java/android/window/flags/lse_desktop_experience.aconfig @@ -414,6 +414,16 @@ flag { } flag { + name: "enable_desktop_recents_transitions_corners_bugfix" + namespace: "lse_desktop_experience" + description: "Enables rounded corners bugfix for Recents transitions." + bug: "383079261" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "enable_move_to_next_display_shortcut" namespace: "lse_desktop_experience" description: "Add new keyboard shortcut of moving a task into next display" @@ -489,4 +499,22 @@ flag { namespace: "lse_desktop_experience" description: "Bugfixes / papercuts to bring Desktop Windowing to secondary displays." bug: "382023296" +} + +flag { + name: "enable_top_visible_root_task_per_user_tracking" + namespace: "lse_desktop_experience" + description: "Enables tracking the top visible root tasks for a user." + bug: "381038076" + is_fixed_read_only: true + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + name: "enable_per_display_desktop_wallpaper_activity" + namespace: "lse_desktop_experience" + description: "Enables having a DesktopWallpaperActivity at a per-display level." + bug: "381935663" }
\ No newline at end of file diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig index 30f0c7371270..30668a6c6b1d 100644 --- a/core/java/android/window/flags/windowing_frontend.aconfig +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -9,16 +9,6 @@ flag { } flag { - name: "reset_draw_state_on_client_invisible" - namespace: "windowing_frontend" - description: "Reset draw state if the client is notified to be invisible" - bug: "373023636" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "wait_for_transition_on_display_switch" namespace: "windowing_frontend" description: "Waits for Shell transition to start before unblocking the screen after display switch" @@ -39,16 +29,6 @@ flag { } flag { - name: "blast_sync_notification_shade_on_display_switch" - namespace: "windowing_frontend" - description: "Make the buffer content of notification shade synchronize with display switch" - bug: "337154331" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "respect_animation_clip" namespace: "windowing_frontend" description: "Fix missing clip transformation of animation" @@ -207,16 +187,6 @@ flag { } flag { - name: "filter_irrelevant_input_device_change" - namespace: "windowing_frontend" - description: "Recompute display configuration only for necessary input device changes" - bug: "368461853" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "respect_non_top_visible_fixed_orientation" namespace: "windowing_frontend" description: "If top activity is not opaque, respect the fixed orientation of activity behind it" @@ -455,6 +425,17 @@ flag { } flag { + name: "remove_defer_hiding_client" + namespace: "windowing_frontend" + description: "Remove mDeferHidingClient since everything is in shell-transition." + is_fixed_read_only: true + bug: "382485959" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "relative_insets" namespace: "windowing_frontend" description: "Support insets definition and calculation relative to task bounds." diff --git a/core/java/com/android/internal/app/EventLogTags.logtags b/core/java/com/android/internal/app/EventLogTags.logtags index d681a8d26e8e..a18a8243305b 100644 --- a/core/java/com/android/internal/app/EventLogTags.logtags +++ b/core/java/com/android/internal/app/EventLogTags.logtags @@ -1,4 +1,4 @@ -# See system/core/logcat/event.logtags for a description of the format of this file. +# See system/logging/logcat/event.logtags for a description of the format of this file. option java_package com.android.internal.app; diff --git a/core/java/com/android/internal/app/NfcResolverActivity.java b/core/java/com/android/internal/app/NfcResolverActivity.java index 78427fe91088..f15dbd65832a 100644 --- a/core/java/com/android/internal/app/NfcResolverActivity.java +++ b/core/java/com/android/internal/app/NfcResolverActivity.java @@ -34,13 +34,13 @@ public class NfcResolverActivity extends ResolverActivity { @Override @SuppressWarnings("MissingSuperCall") // Called indirectly via `super_onCreate()`. protected void onCreate(Bundle savedInstanceState) { - if (!enableNfcMainline()) { + Intent intent = getIntent(); + if (!enableNfcMainline() || intent.getExtras() == null) { super_onCreate(savedInstanceState); finish(); return; } - Intent intent = getIntent(); Intent target = intent.getParcelableExtra(Intent.EXTRA_INTENT, Intent.class); ArrayList<ResolveInfo> rList = intent.getParcelableArrayListExtra( diff --git a/core/java/com/android/internal/content/om/OverlayManagerImpl.java b/core/java/com/android/internal/content/om/OverlayManagerImpl.java index fa5cf2a396b9..5d4e6a083af4 100644 --- a/core/java/com/android/internal/content/om/OverlayManagerImpl.java +++ b/core/java/com/android/internal/content/om/OverlayManagerImpl.java @@ -36,6 +36,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.parsing.FrameworkParsingPackageUtils; import android.content.res.AssetManager; +import android.content.res.Flags; import android.os.FabricatedOverlayInfo; import android.os.FabricatedOverlayInternal; import android.os.FabricatedOverlayInternalEntry; @@ -235,17 +236,24 @@ public class OverlayManagerImpl { Preconditions.checkArgument(!entryList.isEmpty(), "overlay entries shouldn't be empty"); final String overlayName = checkOverlayNameValid(overlayInternal.overlayName); checkPackageName(overlayInternal.packageName); - Preconditions.checkStringNotEmpty(overlayInternal.targetPackageName); + if (Flags.selfTargetingAndroidResourceFrro()) { + Preconditions.checkStringNotEmpty(overlayInternal.targetPackageName); + } else { + checkPackageName(overlayInternal.targetPackageName); + Preconditions.checkStringNotEmpty( + overlayInternal.targetOverlayable, + "Target overlayable should be neither null nor empty string."); + } final ApplicationInfo applicationInfo = mContext.getApplicationInfo(); String targetPackage = null; - if (TextUtils.equals(overlayInternal.targetPackageName, "android")) { + if (Flags.selfTargetingAndroidResourceFrro() && TextUtils.equals( + overlayInternal.targetPackageName, "android")) { targetPackage = AssetManager.FRAMEWORK_APK_PATH; } else { targetPackage = Preconditions.checkStringNotEmpty( applicationInfo.getBaseCodePath()); } - final Path frroPath = mBasePath.resolve(overlayName + FRRO_EXTENSION); final Path idmapPath = mBasePath.resolve(overlayName + IDMAP_EXTENSION); diff --git a/core/java/com/android/internal/inputmethod/InputMethodDebug.java b/core/java/com/android/internal/inputmethod/InputMethodDebug.java index 2a5593f6d584..4d5e67ab8fde 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodDebug.java +++ b/core/java/com/android/internal/inputmethod/InputMethodDebug.java @@ -299,6 +299,12 @@ public final class InputMethodDebug { return "SHOW_SOFT_INPUT_IMM_DEPRECATION"; case SoftInputShowHideReason.CONTROL_WINDOW_INSETS_ANIMATION: return "CONTROL_WINDOW_INSETS_ANIMATION"; + case SoftInputShowHideReason.SHOW_INPUT_TARGET_CHANGED: + return "SHOW_INPUT_TARGET_CHANGED"; + case SoftInputShowHideReason.HIDE_INPUT_TARGET_CHANGED: + return "HIDE_INPUT_TARGET_CHANGED"; + case SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS: + return "HIDE_WINDOW_LOST_FOCUS"; default: return "Unknown=" + reason; } diff --git a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java index 592ea9e5e600..cf0580c2f021 100644 --- a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java +++ b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java @@ -91,7 +91,7 @@ import java.lang.annotation.Retention; SoftInputShowHideReason.CONTROL_WINDOW_INSETS_ANIMATION, SoftInputShowHideReason.SHOW_INPUT_TARGET_CHANGED, SoftInputShowHideReason.HIDE_INPUT_TARGET_CHANGED, - SoftInputShowHideReason.REASON_HIDE_WINDOW_LOST_FOCUS, + SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS, }) public @interface SoftInputShowHideReason { /** Default, undefined reason. */ @@ -340,18 +340,6 @@ public @interface SoftInputShowHideReason { int HIDE_WINDOW_LEGACY_DIRECT = ImeProtoEnums.REASON_HIDE_WINDOW_LEGACY_DIRECT; /** - * Show soft input because the input target changed - * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}. - */ - int SHOW_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_SHOW_INPUT_TARGET_CHANGED; - - /** - * Hide soft input because the input target changed by - * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}. - */ - int HIDE_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_HIDE_INPUT_TARGET_CHANGED; - - /** * Show / Hide soft input by * {@link android.inputmethodservice.InputMethodService#resetStateForNewConfiguration}. */ @@ -420,6 +408,18 @@ public @interface SoftInputShowHideReason { */ int CONTROL_WINDOW_INSETS_ANIMATION = ImeProtoEnums.REASON_CONTROL_WINDOW_INSETS_ANIMATION; + /** + * Show soft input because the input target changed + * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}. + */ + int SHOW_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_SHOW_INPUT_TARGET_CHANGED; + + /** + * Hide soft input because the input target changed by + * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}. + */ + int HIDE_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_HIDE_INPUT_TARGET_CHANGED; + /** Hide soft input when the window lost focus. */ - int REASON_HIDE_WINDOW_LOST_FOCUS = ImeProtoEnums.REASON_HIDE_WINDOW_LOST_FOCUS; + int HIDE_WINDOW_LOST_FOCUS = ImeProtoEnums.REASON_HIDE_WINDOW_LOST_FOCUS; } diff --git a/core/java/com/android/internal/logging/EventLogTags.logtags b/core/java/com/android/internal/logging/EventLogTags.logtags index 693bd16e6170..db47797cb03d 100644 --- a/core/java/com/android/internal/logging/EventLogTags.logtags +++ b/core/java/com/android/internal/logging/EventLogTags.logtags @@ -1,4 +1,4 @@ -# See system/core/logcat/event.logtags for a description of the format of this file. +# See system/logging/logcat/event.logtags for a description of the format of this file. option java_package com.android.internal.logging; diff --git a/core/java/com/android/internal/policy/KeyInterceptionInfo.java b/core/java/com/android/internal/policy/KeyInterceptionInfo.java index fed8fe3b4cc0..b20f6d225b69 100644 --- a/core/java/com/android/internal/policy/KeyInterceptionInfo.java +++ b/core/java/com/android/internal/policy/KeyInterceptionInfo.java @@ -27,13 +27,11 @@ public class KeyInterceptionInfo { // Debug friendly name to help identify the window public final String windowTitle; public final int windowOwnerUid; - public final int inputFeaturesFlags; - public KeyInterceptionInfo(int type, int flags, String title, int uid, int inputFeaturesFlags) { + public KeyInterceptionInfo(int type, int flags, String title, int uid) { layoutParamsType = type; layoutParamsPrivateFlags = flags; windowTitle = title; windowOwnerUid = uid; - this.inputFeaturesFlags = inputFeaturesFlags; } } diff --git a/core/java/com/android/internal/widget/CallLayout.java b/core/java/com/android/internal/widget/CallLayout.java index c85257578492..3a7c75afdd14 100644 --- a/core/java/com/android/internal/widget/CallLayout.java +++ b/core/java/com/android/internal/widget/CallLayout.java @@ -30,7 +30,6 @@ import android.util.AttributeSet; import android.view.RemotableViewMethod; import android.widget.FrameLayout; import android.widget.RemoteViews; -import android.widget.TextView; import android.widget.flags.Flags; import com.android.internal.R; @@ -59,7 +58,6 @@ public class CallLayout extends FrameLayout { private CachingIconView mConversationIconView; private CachingIconView mIcon; private CachingIconView mConversationIconBadgeBg; - private TextView mConversationText; public CallLayout(@NonNull Context context) { super(context); @@ -83,7 +81,6 @@ public class CallLayout extends FrameLayout { protected void onFinishInflate() { super.onFinishInflate(); mPeopleHelper.init(getContext()); - mConversationText = findViewById(R.id.conversation_text); mConversationIconView = findViewById(R.id.conversation_icon); mIcon = findViewById(R.id.icon); mConversationIconBadgeBg = findViewById(R.id.conversation_icon_badge_bg); diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java index 4b90420a75ee..b3ab5d3cd258 100644 --- a/core/java/com/android/internal/widget/ConversationLayout.java +++ b/core/java/com/android/internal/widget/ConversationLayout.java @@ -777,37 +777,40 @@ public class ConversationLayout extends FrameLayout } - int conversationAvatarSize; - int facepileAvatarSize; - int facePileBackgroundSize; - if (mIsCollapsed) { - conversationAvatarSize = mConversationAvatarSize; - facepileAvatarSize = mFacePileAvatarSize; - facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidth; - } else { - conversationAvatarSize = mConversationAvatarSizeExpanded; - facepileAvatarSize = mFacePileAvatarSizeExpandedGroup; - facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidthExpanded; - } - LayoutParams layoutParams = (LayoutParams) mConversationFacePile.getLayoutParams(); - layoutParams.width = conversationAvatarSize; - layoutParams.height = conversationAvatarSize; - mConversationFacePile.setLayoutParams(layoutParams); + if (!notificationsRedesignTemplates()) { + // We no longer need to update the size based on expansion state. + int conversationAvatarSize; + int facepileAvatarSize; + int facePileBackgroundSize; + if (mIsCollapsed) { + conversationAvatarSize = mConversationAvatarSize; + facepileAvatarSize = mFacePileAvatarSize; + facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidth; + } else { + conversationAvatarSize = mConversationAvatarSizeExpanded; + facepileAvatarSize = mFacePileAvatarSizeExpandedGroup; + facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidthExpanded; + } + LayoutParams layoutParams = (LayoutParams) mConversationFacePile.getLayoutParams(); + layoutParams.width = conversationAvatarSize; + layoutParams.height = conversationAvatarSize; + mConversationFacePile.setLayoutParams(layoutParams); - layoutParams = (LayoutParams) bottomView.getLayoutParams(); - layoutParams.width = facepileAvatarSize; - layoutParams.height = facepileAvatarSize; - bottomView.setLayoutParams(layoutParams); + layoutParams = (LayoutParams) bottomView.getLayoutParams(); + layoutParams.width = facepileAvatarSize; + layoutParams.height = facepileAvatarSize; + bottomView.setLayoutParams(layoutParams); - layoutParams = (LayoutParams) topView.getLayoutParams(); - layoutParams.width = facepileAvatarSize; - layoutParams.height = facepileAvatarSize; - topView.setLayoutParams(layoutParams); + layoutParams = (LayoutParams) topView.getLayoutParams(); + layoutParams.width = facepileAvatarSize; + layoutParams.height = facepileAvatarSize; + topView.setLayoutParams(layoutParams); - layoutParams = (LayoutParams) bottomBackground.getLayoutParams(); - layoutParams.width = facePileBackgroundSize; - layoutParams.height = facePileBackgroundSize; - bottomBackground.setLayoutParams(layoutParams); + layoutParams = (LayoutParams) bottomBackground.getLayoutParams(); + layoutParams.width = facePileBackgroundSize; + layoutParams.height = facePileBackgroundSize; + bottomBackground.setLayoutParams(layoutParams); + } } /** @@ -832,6 +835,11 @@ public class ConversationLayout extends FrameLayout * update the icon position and sizing */ private void updateIconPositionAndSize() { + if (notificationsRedesignTemplates()) { + // Icon size is fixed in the redesign. + return; + } + int badgeProtrusion; int conversationAvatarSize; if (mIsOneToOne || mIsCollapsed) { @@ -864,6 +872,11 @@ public class ConversationLayout extends FrameLayout } private void updatePaddingsBasedOnContentAvailability() { + if (notificationsRedesignTemplates()) { + // group icons have the same size as 1:1 conversations + return; + } + // groups have avatars that need more spacing mMessagingLinearLayout.setSpacing( mIsOneToOne ? mMessageSpacingStandard : mMessageSpacingGroup); diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 19c6f51ff9a7..9bd52372e6c4 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -1326,7 +1326,7 @@ public class LockPatternUtils { try { getLockSettings().registerStrongAuthTracker(strongAuthTracker.getStub()); } catch (RemoteException e) { - throw new RuntimeException("Could not register StrongAuthTracker"); + e.rethrowFromSystemServer(); } } diff --git a/core/java/com/android/internal/widget/MessagingGroup.java b/core/java/com/android/internal/widget/MessagingGroup.java index 4305ba753e46..169a9e8585b0 100644 --- a/core/java/com/android/internal/widget/MessagingGroup.java +++ b/core/java/com/android/internal/widget/MessagingGroup.java @@ -81,7 +81,6 @@ public class MessagingGroup extends NotificationOptimizedLinearLayout implements private MessagingLinearLayout mMessageContainer; ImageFloatingTextView mSenderView; private ImageView mAvatarView; - private View mAvatarContainer; private String mAvatarSymbol = ""; private int mLayoutColor; private CharSequence mAvatarName = ""; @@ -717,6 +716,11 @@ public class MessagingGroup extends NotificationOptimizedLinearLayout implements * @param isInConversation is this in a conversation */ public void setIsInConversation(boolean isInConversation) { + if (Flags.notificationsRedesignTemplates()) { + // No alignment adjustments are necessary in the redesign, as the size of the icons + // in both conversations and old messaging notifications are the same. + return; + } if (mIsInConversation != isInConversation) { mIsInConversation = isInConversation; MarginLayoutParams layoutParams = diff --git a/core/java/org/chromium/arc/EventLogTags.logtags b/core/java/org/chromium/arc/EventLogTags.logtags index 1b7160e90224..8102d6f10ed4 100644 --- a/core/java/org/chromium/arc/EventLogTags.logtags +++ b/core/java/org/chromium/arc/EventLogTags.logtags @@ -1,4 +1,4 @@ -# See system/core/logcat/event.logtags for a description of the format of this file. +# See system/logging/logcat/event.logtags for a description of the format of this file. option java_package org.chromium.arc diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 8e3303a4ddbd..027113a75f6b 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -92,7 +92,6 @@ cc_library_shared_for_libandroid_runtime { "android_view_VelocityTracker.cpp", "android_view_VerifiedKeyEvent.cpp", "android_view_VerifiedMotionEvent.cpp", - "com_android_internal_util_ArrayUtils.cpp", "com_android_internal_util_VirtualRefBasePtr.cpp", "core_jni_helpers.cpp", ":deviceproductinfoconstants_aidl", @@ -264,6 +263,7 @@ cc_library_shared_for_libandroid_runtime { "com_android_internal_os_ZygoteCommandBuffer.cpp", "com_android_internal_os_ZygoteInit.cpp", "com_android_internal_security_VerityUtils.cpp", + "com_android_internal_util_ArrayUtils.cpp", "hwbinder/EphemeralStorage.cpp", "fd_utils.cpp", "android_hardware_input_InputWindowHandle.cpp", diff --git a/core/jni/android_app_PropertyInvalidatedCache.cpp b/core/jni/android_app_PropertyInvalidatedCache.cpp index ead66660a0a4..12585d5f8137 100644 --- a/core/jni/android_app_PropertyInvalidatedCache.cpp +++ b/core/jni/android_app_PropertyInvalidatedCache.cpp @@ -28,24 +28,77 @@ #include "core_jni_helpers.h" #include "android_app_PropertyInvalidatedCache.h" +namespace android::app::PropertyInvalidatedCache { + +// These provide run-time access to the sizing parameters. +int NonceStore::getMaxNonce() const { + return kMaxNonce; +} + +size_t NonceStore::getMaxByte() const { + return kMaxByte; +} + +// Fetch a nonce, returning UNSET if the index is out of range. This method specifically +// does not throw or generate an error if the index is out of range; this allows the method +// to be called in a CriticalNative JNI API. +int64_t NonceStore::getNonce(int index) const { + if (index < 0 || index >= kMaxNonce) { + return UNSET; + } else { + return nonce()[index]; + } +} + +// Set a nonce and return true. Return false if the index is out of range. This method +// specifically does not throw or generate an error if the index is out of range; this +// allows the method to be called in a CriticalNative JNI API. +bool NonceStore::setNonce(int index, int64_t value) { + if (index < 0 || index >= kMaxNonce) { + return false; + } else { + nonce()[index] = value; + return true; + } +} + +// Fetch just the byte-block hash +int32_t NonceStore::getHash() const { + return mByteHash; +} + +// Copy the byte block to the target and return the current hash. +int32_t NonceStore::getByteBlock(block_t* block, size_t len) const { + memcpy(block, (void*) byteBlock(), std::min(kMaxByte, len)); + return mByteHash; +} + +// Set the byte block and the hash. +void NonceStore::setByteBlock(int hash, const block_t* block, size_t len) { + memcpy((void*) byteBlock(), block, len = std::min(kMaxByte, len)); + mByteHash = hash; +} + +} // namespace android::app::PropertyInvalidatedCache; + namespace { using namespace android::app::PropertyInvalidatedCache; // Convert a jlong to a nonce block. This is a convenience function that should be inlined by // the compiler. -inline SystemCacheNonce* sysCache(jlong ptr) { - return reinterpret_cast<SystemCacheNonce*>(ptr); +inline NonceStore* nonceCache(jlong ptr) { + return reinterpret_cast<NonceStore*>(ptr); } // Return the number of nonces in the nonce block. jint getMaxNonce(JNIEnv*, jclass, jlong ptr) { - return sysCache(ptr)->getMaxNonce(); + return nonceCache(ptr)->getMaxNonce(); } // Return the number of string bytes in the nonce block. jint getMaxByte(JNIEnv*, jclass, jlong ptr) { - return sysCache(ptr)->getMaxByte(); + return nonceCache(ptr)->getMaxByte(); } // Set the byte block. The first int is the hash to set and the second is the array to copy. @@ -56,25 +109,25 @@ void setByteBlock(JNIEnv* env, jclass, jlong ptr, jint hash, jbyteArray val) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "null byte block"); return; } - sysCache(ptr)->setByteBlock(hash, value.get(), value.size()); + nonceCache(ptr)->setByteBlock(hash, value.get(), value.size()); } // Fetch the byte block. If the incoming hash is the same as the local hash, the Java layer is // presumed to have an up-to-date copy of the byte block; do not copy byte array. The local // hash is returned. jint getByteBlock(JNIEnv* env, jclass, jlong ptr, jint hash, jbyteArray val) { - if (sysCache(ptr)->getHash() == hash) { + if (nonceCache(ptr)->getHash() == hash) { return hash; } ScopedByteArrayRW value(env, val); - return sysCache(ptr)->getByteBlock(value.get(), value.size()); + return nonceCache(ptr)->getByteBlock(value.get(), value.size()); } // Fetch the byte block hash. // // This is a CriticalNative method and therefore does not get the JNIEnv or jclass parameters. jint getByteBlockHash(jlong ptr) { - return sysCache(ptr)->getHash(); + return nonceCache(ptr)->getHash(); } // Get a nonce value. So that this method can be CriticalNative, it returns 0 if the value is @@ -83,7 +136,7 @@ jint getByteBlockHash(jlong ptr) { // // This method is @CriticalNative and does not take a JNIEnv* or jclass argument. jlong getNonce(jlong ptr, jint index) { - return sysCache(ptr)->getNonce(index); + return nonceCache(ptr)->getNonce(index); } // Set a nonce value. So that this method can be CriticalNative, it returns a boolean: false if @@ -92,7 +145,7 @@ jlong getNonce(jlong ptr, jint index) { // // This method is @CriticalNative and does not take a JNIEnv* or jclass argument. jboolean setNonce(jlong ptr, jint index, jlong value) { - return sysCache(ptr)->setNonce(index, value); + return nonceCache(ptr)->setNonce(index, value); } static const JNINativeMethod gMethods[] = { diff --git a/core/jni/android_app_PropertyInvalidatedCache.h b/core/jni/android_app_PropertyInvalidatedCache.h index eefa8fa88624..00aa281b572f 100644 --- a/core/jni/android_app_PropertyInvalidatedCache.h +++ b/core/jni/android_app_PropertyInvalidatedCache.h @@ -18,129 +18,139 @@ #include <memory.h> #include <atomic> +#include <cstdint> -namespace android { -namespace app { -namespace PropertyInvalidatedCache { +namespace android::app::PropertyInvalidatedCache { /** - * A cache nonce block contains an array of std::atomic<int64_t> and an array of bytes. The - * byte array has an associated hash. This class provides methods to read and write the fields - * of the block but it does not interpret the fields. - * - * On initialization, all fields are set to zero. - * - * In general, methods do not report errors. This allows the methods to be used in - * CriticalNative JNI APIs. - * - * The template is parameterized by the number of nonces it supports and the number of bytes in - * the string block. + * A head of a CacheNonce object. This contains all the fields that have a fixed size and + * location. Fields with a variable location are found via offsets. The offsets make this + * object position-independent, which is required because it is in shared memory and would be + * mapped into different virtual addresses for different processes. */ -template<int maxNonce, size_t maxByte> class CacheNonce { - - // The value of an unset field. - static const int UNSET = 0; - +class NonceStore { + protected: // A convenient typedef. The jbyteArray element type is jbyte, which the compiler treats as // signed char. typedef signed char block_t; - // The array of nonces - volatile std::atomic<int64_t> mNonce[maxNonce]; + // The nonce type. + typedef std::atomic<int64_t> nonce_t; - // The byte array. This is not atomic but it is guarded by the mByteHash. - volatile block_t mByteBlock[maxByte]; + // Atomics should be safe to use across processes if they are lock free. + static_assert(nonce_t::is_always_lock_free == true); - // The hash that validates the byte block - volatile std::atomic<int32_t> mByteHash; + // The value of an unset field. + static constexpr int UNSET = 0; - // Pad the class to a multiple of 8 bytes. - int32_t _pad; + // The size of the nonce array. + const int32_t kMaxNonce; - public: + // The size of the byte array. + const size_t kMaxByte; - // The expected size of this instance. This is a compile-time constant and can be used in a - // static assertion. - static const int expectedSize = - maxNonce * sizeof(std::atomic<int64_t>) - + sizeof(std::atomic<int32_t>) - + maxByte * sizeof(block_t) - + sizeof(int32_t); + // The offset to the nonce array. + const size_t mNonceOffset; - // These provide run-time access to the sizing parameters. - int getMaxNonce() const { - return maxNonce; - } + // The offset to the byte array. + const size_t mByteOffset; - size_t getMaxByte() const { - return maxByte; - } + // The byte block hash. This is fixed and at a known offset, so leave it in the base class. + volatile std::atomic<int32_t> mByteHash; - // Construct and initialize the memory. - CacheNonce() { - for (int i = 0; i < maxNonce; i++) { - mNonce[i] = UNSET; - } - mByteHash = UNSET; - memset((void*) mByteBlock, UNSET, sizeof(mByteBlock)); + // The constructor is protected! It only makes sense when called from a subclass. + NonceStore(int kMaxNonce, size_t kMaxByte, volatile nonce_t* nonce, volatile block_t* block) : + kMaxNonce(kMaxNonce), + kMaxByte(kMaxByte), + mNonceOffset(offset(this, const_cast<nonce_t*>(nonce))), + mByteOffset(offset(this, const_cast<block_t*>(block))) { } + public: + + // These provide run-time access to the sizing parameters. + int getMaxNonce() const; + size_t getMaxByte() const; + // Fetch a nonce, returning UNSET if the index is out of range. This method specifically // does not throw or generate an error if the index is out of range; this allows the method // to be called in a CriticalNative JNI API. - int64_t getNonce(int index) const { - if (index < 0 || index >= maxNonce) { - return UNSET; - } else { - return mNonce[index]; - } - } + int64_t getNonce(int index) const; // Set a nonce and return true. Return false if the index is out of range. This method // specifically does not throw or generate an error if the index is out of range; this // allows the method to be called in a CriticalNative JNI API. - bool setNonce(int index, int64_t value) { - if (index < 0 || index >= maxNonce) { - return false; - } else { - mNonce[index] = value; - return true; - } - } + bool setNonce(int index, int64_t value); // Fetch just the byte-block hash - int32_t getHash() const { - return mByteHash; - } + int32_t getHash() const; // Copy the byte block to the target and return the current hash. - int32_t getByteBlock(block_t* block, size_t len) const { - memcpy(block, (void*) mByteBlock, std::min(maxByte, len)); - return mByteHash; - } + int32_t getByteBlock(block_t* block, size_t len) const; // Set the byte block and the hash. - void setByteBlock(int hash, const block_t* block, size_t len) { - memcpy((void*) mByteBlock, block, len = std::min(maxByte, len)); - mByteHash = hash; + void setByteBlock(int hash, const block_t* block, size_t len); + + private: + + // A convenience function to compute the offset between two unlike pointers. + static size_t offset(void const* base, void const* member) { + return reinterpret_cast<uintptr_t>(member) - reinterpret_cast<std::uintptr_t>(base); + } + + // Return the address of the nonce array. + volatile nonce_t* nonce() const { + // The array is located at an offset from <this>. + return reinterpret_cast<nonce_t*>( + reinterpret_cast<std::uintptr_t>(this) + mNonceOffset); + } + + // Return the address of the byte block array. + volatile block_t* byteBlock() const { + // The array is located at an offset from <this>. + return reinterpret_cast<block_t*>( + reinterpret_cast<std::uintptr_t>(this) + mByteOffset); } }; /** - * Sizing parameters for the system_server PropertyInvalidatedCache support. A client can - * retrieve the values through the accessors in CacheNonce instances. + * A cache nonce block contains an array of std::atomic<int64_t> and an array of bytes. The + * byte array has an associated hash. This class provides methods to read and write the fields + * of the block but it does not interpret the fields. + * + * On initialization, all fields are set to zero. + * + * In general, methods do not report errors. This allows the methods to be used in + * CriticalNative JNI APIs. + * + * The template is parameterized by the number of nonces it supports and the number of bytes in + * the string block. */ -static const int MAX_NONCE = 64; -static const int BYTE_BLOCK_SIZE = 8192; +template<int maxNonce, size_t maxByte> class CacheNonce : public NonceStore { + + // The array of nonces + volatile nonce_t mNonce[maxNonce]; -// The CacheNonce for system server holds 64 nonces with a string block of 8192 bytes. -typedef CacheNonce<MAX_NONCE, BYTE_BLOCK_SIZE> SystemCacheNonce; + // The byte array. This is not atomic but it is guarded by the mByteHash. + volatile block_t mByteBlock[maxByte]; + + public: + // Construct and initialize the memory. + CacheNonce() : + NonceStore(maxNonce, maxByte, &mNonce[0], &mByteBlock[0]) + { + for (int i = 0; i < maxNonce; i++) { + mNonce[i] = UNSET; + } + mByteHash = UNSET; + memset((void*) mByteBlock, UNSET, sizeof(mByteBlock)); + } +}; -// The goal of this assertion is to ensure that the data structure is the same size across 32-bit -// and 64-bit systems. -static_assert(sizeof(SystemCacheNonce) == SystemCacheNonce::expectedSize, - "Unexpected SystemCacheNonce size"); +// The CacheNonce for system server holds 64 nonces with a string block of 8192 bytes. This is +// more than enough for system_server PropertyInvalidatedCache support. The configuration +// values are not defined as visible constants. Clients should use the accessors on the +// SystemCacheNonce instance if they need the sizing parameters. +typedef CacheNonce</* max nonce */ 64, /* byte block size */ 8192> SystemCacheNonce; -} // namespace PropertyInvalidatedCache -} // namespace app -} // namespace android +} // namespace android.app.PropertyInvalidatedCache diff --git a/core/jni/android_database_SQLiteRawStatement.cpp b/core/jni/android_database_SQLiteRawStatement.cpp index 85a6bdf95928..5fa808361178 100644 --- a/core/jni/android_database_SQLiteRawStatement.cpp +++ b/core/jni/android_database_SQLiteRawStatement.cpp @@ -70,12 +70,33 @@ static void throwInvalidParameter(JNIEnv *env, jlong stmtPtr, jint index) { } } +// If the last operation failed, throw an exception and return true. Otherwise return false. +static bool throwIfError(JNIEnv *env, jlong stmtPtr) { + switch (sqlite3_errcode(db(stmtPtr))) { + case SQLITE_OK: + case SQLITE_DONE: + case SQLITE_ROW: return false; + } + throw_sqlite3_exception(env, db(stmtPtr), nullptr); + return true; +} -// This throws a SQLiteBindOrColumnIndexOutOfRangeException if the column index is out -// of bounds. It returns true if an exception was thrown. +// This throws a SQLiteBindOrColumnIndexOutOfRangeException if the column index is outside the +// bounds of the row data set. It throws SQLiteMisuseException if the statement's data column +// count is zero; that generally occurs because the client has forgotten to call step() or the +// client has stepped past the end of the query. The function returns true if an exception was +// thrown. static bool throwIfInvalidColumn(JNIEnv *env, jlong stmtPtr, jint col) { - if (col < 0 || col >= sqlite3_data_count(stmt(stmtPtr))) { - int count = sqlite3_data_count(stmt(stmtPtr)); + int count = sqlite3_data_count(stmt(stmtPtr)); + if (throwIfError(env, stmtPtr)) { + return true; + } else if (count == 0) { + // A count of zero indicates a misuse: the statement has never been step()'ed. + const char* message = "row has no data"; + const char* errmsg = sqlite3_errstr(SQLITE_MISUSE); + throw_sqlite3_exception(env, SQLITE_MISUSE, errmsg, message); + return true; + } else if (col < 0 || col >= count) { std::string message = android::base::StringPrintf( "column index %d out of bounds [0,%d]", col, count - 1); char const * errmsg = sqlite3_errstr(SQLITE_RANGE); @@ -86,15 +107,22 @@ static bool throwIfInvalidColumn(JNIEnv *env, jlong stmtPtr, jint col) { } } -// If the last operation failed, throw an exception and return true. Otherwise return false. -static bool throwIfError(JNIEnv *env, jlong stmtPtr) { - switch (sqlite3_errcode(db(stmtPtr))) { - case SQLITE_OK: - case SQLITE_DONE: - case SQLITE_ROW: return false; +// This throws a SQLiteBindOrColumnIndexOutOfRangeException if the column index is outside the +// bounds of the result set. (This is not the same as the data columns in a row). The function +// returns true if an exception was thrown. +static bool throwIfInvalidResultColumn(JNIEnv *env, jlong stmtPtr, jint col) { + int count = sqlite3_column_count(stmt(stmtPtr)); + if (throwIfError(env, stmtPtr)) { + return true; + } else if (col < 0 || col >= count) { + std::string message = android::base::StringPrintf( + "column index %d out of bounds [0,%d]", col, count - 1); + char const * errmsg = sqlite3_errstr(SQLITE_RANGE); + throw_sqlite3_exception(env, SQLITE_RANGE, errmsg, message.c_str()); + return true; + } else { + return false; } - throw_sqlite3_exception(env, db(stmtPtr), nullptr); - return true; } static jint bindParameterCount(JNIEnv* env, jclass, jlong stmtPtr) { @@ -226,7 +254,7 @@ static jint columnType(JNIEnv* env, jclass, jlong stmtPtr, jint col) { } static jstring columnName(JNIEnv* env, jclass, jlong stmtPtr, jint col) { - if (throwIfInvalidColumn(env, stmtPtr, col)) { + if (throwIfInvalidResultColumn(env, stmtPtr, col)) { return nullptr; } const jchar* name = static_cast<const jchar*>(sqlite3_column_name16(stmt(stmtPtr), col)); diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 7ef7829c6ba5..dc7253954d44 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -589,32 +589,6 @@ jint android_os_Process_getThreadPriority(JNIEnv* env, jobject clazz, return pri; } -jboolean android_os_Process_setSwappiness(JNIEnv *env, jobject clazz, - jint pid, jboolean is_increased) -{ - char text[64]; - - if (is_increased) { - strcpy(text, "/sys/fs/cgroup/memory/sw/tasks"); - } else { - strcpy(text, "/sys/fs/cgroup/memory/tasks"); - } - - struct stat st; - if (stat(text, &st) || !S_ISREG(st.st_mode)) { - return false; - } - - int fd = open(text, O_WRONLY | O_CLOEXEC); - if (fd >= 0) { - sprintf(text, "%" PRId32, pid); - write(fd, text, strlen(text)); - close(fd); - } - - return true; -} - void android_os_Process_setArgV0(JNIEnv* env, jobject clazz, jstring name) { if (name == NULL) { @@ -1396,7 +1370,6 @@ static const JNINativeMethod methods[] = { {"getProcessGroup", "(I)I", (void*)android_os_Process_getProcessGroup}, {"createProcessGroup", "(II)I", (void*)android_os_Process_createProcessGroup}, {"getExclusiveCores", "()[I", (void*)android_os_Process_getExclusiveCores}, - {"setSwappiness", "(IZ)Z", (void*)android_os_Process_setSwappiness}, {"setArgV0Native", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0}, {"setUid", "(I)I", (void*)android_os_Process_setUid}, {"setGid", "(I)I", (void*)android_os_Process_setGid}, diff --git a/core/jni/com_android_internal_content_FileSystemUtils.cpp b/core/jni/com_android_internal_content_FileSystemUtils.cpp index 76ead2a3ca31..48c92c87f54e 100644 --- a/core/jni/com_android_internal_content_FileSystemUtils.cpp +++ b/core/jni/com_android_internal_content_FileSystemUtils.cpp @@ -21,8 +21,6 @@ #include <android-base/file.h> #include <android-base/hex.h> #include <android-base/unique_fd.h> -#include <bionic/macros.h> -#include <errno.h> #include <fcntl.h> #include <inttypes.h> #include <linux/fs.h> @@ -48,8 +46,8 @@ bool punchWithBlockAlignment(borrowed_fd fd, uint64_t start, uint64_t length, ui return false; } - start = align_up(start, blockSize); - end = align_down(end, blockSize); + start = __builtin_align_up(start, blockSize); + end = __builtin_align_down(end, blockSize); uint64_t alignedLength; if (__builtin_sub_overflow(end, start, &alignedLength)) { @@ -67,7 +65,7 @@ bool punchWithBlockAlignment(borrowed_fd fd, uint64_t start, uint64_t length, ui int result = fallocate(fd.get(), FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, start, alignedLength); if (result < 0) { - ALOGE("fallocate failed to punch hole, error:%d", errno); + ALOGE("fallocate failed to punch hole: %m"); return false; } @@ -78,7 +76,7 @@ bool punchHoles(const char *filePath, const uint64_t offset, const std::vector<Elf64_Phdr> &programHeaders) { struct stat64 beforePunch; if (int result = lstat64(filePath, &beforePunch); result != 0) { - ALOGE("lstat64 failed for filePath %s, error:%d", filePath, errno); + ALOGE("lstat64 failed for filePath %s: %m", filePath); return false; } @@ -190,7 +188,7 @@ bool punchHoles(const char *filePath, const uint64_t offset, IF_ALOGD() { struct stat64 afterPunch; if (int result = lstat64(filePath, &afterPunch); result != 0) { - ALOGD("lstat64 failed for filePath %s, error:%d", filePath, errno); + ALOGD("lstat64 failed for filePath %s: %m", filePath); return false; } ALOGD("Size after punching holes st_blocks: %" PRIu64 ", st_blksize: %" PRIu64 @@ -269,7 +267,7 @@ bool punchHolesInZip(const char *filePath, uint64_t offset, uint16_t extraFieldL struct stat64 beforePunch; if (int result = lstat64(filePath, &beforePunch); result != 0) { - ALOGE("lstat64 failed for filePath %s, error:%d", filePath, errno); + ALOGE("lstat64 failed for filePath %s: %m", filePath); return false; } @@ -348,7 +346,7 @@ bool punchHolesInZip(const char *filePath, uint64_t offset, uint16_t extraFieldL IF_ALOGD() { struct stat64 afterPunch; if (int result = lstat64(filePath, &afterPunch); result != 0) { - ALOGD("lstat64 failed for filePath %s, error:%d", filePath, errno); + ALOGD("lstat64 failed for filePath %s: %m", filePath); return false; } ALOGD("punchHolesInApk:: Size after punching holes st_blocks: %" PRIu64 diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index aeaeeca3e845..8c7b335e6e86 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -88,8 +88,8 @@ #include "nativebridge/native_bridge.h" #if defined(__BIONIC__) +#include <android/dlext_private.h> extern "C" void android_reset_stack_guards(); -extern "C" void android_set_16kb_appcompat_mode(bool enable_app_compat); #endif namespace { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 6b8056c77fda..82cad8b3a477 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4535,11 +4535,11 @@ <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_GLASSES" android:protectionLevel="normal" /> - <!-- Allows application to request to be associated with a virtual display capable of streaming + <!-- Allows application to request to be associated with a virtual device capable of streaming Android applications ({@link android.companion.AssociationRequest#DEVICE_PROFILE_APP_STREAMING}) by {@link android.companion.CompanionDeviceManager}. - <p>Not for use by third-party applications. + <p>Not for use by third-party applications. --> <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING" android:protectionLevel="signature|privileged" /> @@ -4547,16 +4547,25 @@ <!-- Allows application to request to stream content from an Android host to a nearby device ({@link android.companion.AssociationRequest#DEVICE_PROFILE_NEARBY_DEVICE_STREAMING}) by {@link android.companion.CompanionDeviceManager}. - <p>Not for use by third-party applications. + <p>Not for use by third-party applications. --> <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING" android:protectionLevel="signature|privileged" /> + <!-- Allows application to request to stream content from an Android host to a nearby device + ({@link android.companion.AssociationRequest#DEVICE_PROFILE_SENSOR_DEVICE_STREAMING}) + by {@link android.companion.CompanionDeviceManager}. + <p>Not for use by third-party applications. + @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ENABLE_LIMITED_VDM_ROLE) + --> + <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING" + android:protectionLevel="signature|privileged" /> + <!-- Allows application to request to be associated with a vehicle head unit capable of automotive projection ({@link android.companion.AssociationRequest#DEVICE_PROFILE_AUTOMOTIVE_PROJECTION}) by {@link android.companion.CompanionDeviceManager}. - <p>Not for use by third-party applications. + <p>Not for use by third-party applications. --> <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION" android:protectionLevel="internal|role" /> @@ -4565,7 +4574,7 @@ and/or data with other devices, such as notifications, photos and media ({@link android.companion.AssociationRequest#DEVICE_PROFILE_COMPUTER}) by {@link android.companion.CompanionDeviceManager}. - <p>Not for use by third-party applications. + <p>Not for use by third-party applications. --> <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_COMPUTER" android:protectionLevel="signature|privileged" /> @@ -5639,11 +5648,21 @@ <!-- Allows an application to subscribe to device locked and keyguard locked (i.e., showing) state. - <p>Protection level: signature|role - <p>Intended for use by ROLE_ASSISTANT and signature apps only. + <p>Protection level: signature|module|role + <p>Intended for use by ROLE_ASSISTANT, VDM, and signature apps only. + --> + <permission android:name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" + android:protectionLevel="signature|module|role" + android:featureFlag="!android.security.subscribe_to_keyguard_locked_state_perm_priv_flag"/> + + <!-- Allows an application to subscribe to device locked and keyguard locked (i.e., showing) + state. + <p>Protection level: signature|privileged|module|role + <p>Intended for use by ROLE_ASSISTANT, VDM, and signature / privileged apps only. --> <permission android:name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" - android:protectionLevel="signature|module|role"/> + android:protectionLevel="signature|privileged|module|role" + android:featureFlag="android.security.subscribe_to_keyguard_locked_state_perm_priv_flag"/> <!-- Must be required by a {@link android.service.autofill.AutofillService}, to ensure that only the system can bind to it. diff --git a/core/res/res/color-watch-v36/btn_material_filled_background_color.xml b/core/res/res/color/btn_material_filled_background_color_watch.xml index 70aace4e7d76..78547bc52f00 100644 --- a/core/res/res/color-watch-v36/btn_material_filled_background_color.xml +++ b/core/res/res/color/btn_material_filled_background_color_watch.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" - android:alpha="?attr/disabledAlpha" - android:color="?attr/materialColorOnSurface" /> - <item android:color="?attr/materialColorPrimary" /> + android:alpha="@dimen/disabled_alpha_wear_material3" + android:color="@color/materialColorOnSurface" /> + <item android:color="@color/materialColorPrimary" /> </selector>
\ No newline at end of file diff --git a/core/res/res/color-watch-v36/btn_material_filled_content_color.xml b/core/res/res/color/btn_material_filled_content_color_watch.xml index 4cc8fe5ecb91..3a4ec3cff935 100644 --- a/core/res/res/color-watch-v36/btn_material_filled_content_color.xml +++ b/core/res/res/color/btn_material_filled_content_color_watch.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" - android:alpha="?attr/primaryContentAlpha" - android:color="?attr/materialColorOnSurface" /> - <item android:color="?attr/materialColorOnPrimary" /> + android:alpha="@dimen/primary_content_alpha_wear_material3" + android:color="@color/materialColorOnSurface" /> + <item android:color="@color/materialColorOnPrimary" /> </selector>
\ No newline at end of file diff --git a/core/res/res/color-watch-v36/btn_material_filled_tonal_background_color.xml b/core/res/res/color/btn_material_filled_tonal_background_color_watch.xml index b2a25af0d670..e9b7e4c286bd 100644 --- a/core/res/res/color-watch-v36/btn_material_filled_tonal_background_color.xml +++ b/core/res/res/color/btn_material_filled_tonal_background_color_watch.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" - android:alpha="?attr/disabledAlpha" - android:color="?attr/materialColorOnSurface" /> - <item android:color="?attr/materialColorSurfaceContainer" /> + android:alpha="@dimen/disabled_alpha_wear_material3" + android:color="@color/materialColorOnSurface" /> + <item android:color="@color/materialColorSurfaceContainer" /> </selector>
\ No newline at end of file diff --git a/core/res/res/color-watch-v36/btn_material_filled_tonal_content_color.xml b/core/res/res/color/btn_material_filled_tonal_content_color_watch.xml index 59810356c3b4..8b5deda05745 100644 --- a/core/res/res/color-watch-v36/btn_material_filled_tonal_content_color.xml +++ b/core/res/res/color/btn_material_filled_tonal_content_color_watch.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" - android:alpha="?attr/primaryContentAlpha" - android:color="?attr/materialColorOnSurface" /> - <item android:color="?attr/materialColorOnSurface" /> + android:alpha="@dimen/primary_content_alpha_wear_material3" + android:color="@color/materialColorOnSurface" /> + <item android:color="@color/materialColorOnSurface" /> </selector>
\ No newline at end of file diff --git a/core/res/res/color-watch-v36/btn_material_outlined_background_color.xml b/core/res/res/color/btn_material_outlined_background_color_watch.xml index 665f47faca0d..f9c9a3f82341 100644 --- a/core/res/res/color-watch-v36/btn_material_outlined_background_color.xml +++ b/core/res/res/color/btn_material_outlined_background_color_watch.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" - android:alpha="?attr/disabledAlpha" - android:color="?attr/materialColorOnSurface" /> - <item android:color="?attr/materialColorOutline" /> + android:alpha="@dimen/disabled_alpha_wear_material3" + android:color="@color/materialColorOnSurface" /> + <item android:color="@color/materialColorOutline" /> </selector> diff --git a/core/res/res/color/input_method_switch_on_item.xml b/core/res/res/color/input_method_switch_on_item.xml index 49fe0815c757..f38e0ac3454e 100644 --- a/core/res/res/color/input_method_switch_on_item.xml +++ b/core/res/res/color/input_method_switch_on_item.xml @@ -16,6 +16,6 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_activated="true" android:color="?attr/materialColorOnSecondaryContainer" /> - <item android:color="?attr/materialColorOnSurface" /> + <item android:state_activated="true" android:color="@color/materialColorOnSecondaryContainer" /> + <item android:color="@color/materialColorOnSurface" /> </selector> diff --git a/core/res/res/color/notification_expand_button_state_tint.xml b/core/res/res/color/notification_expand_button_state_tint.xml index 5a8594f0e461..3409a2c7ab14 100644 --- a/core/res/res/color/notification_expand_button_state_tint.xml +++ b/core/res/res/color/notification_expand_button_state_tint.xml @@ -16,9 +16,9 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnPrimaryFixed" + <item android:state_pressed="true" android:color="@androidprv:color/materialColorOnPrimaryFixed" android:alpha="0.15"/> - <item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnPrimaryFixed" + <item android:state_hovered="true" android:color="@androidprv:color/materialColorOnPrimaryFixed" android:alpha="0.11"/> <item android:color="@color/transparent" /> </selector>
\ No newline at end of file diff --git a/core/res/res/color/system_on_surface_disabled.xml b/core/res/res/color/system_on_surface_disabled.xml index aba87f543c44..039ab024a32a 100644 --- a/core/res/res/color/system_on_surface_disabled.xml +++ b/core/res/res/color/system_on_surface_disabled.xml @@ -15,6 +15,6 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="?attr/materialColorOnSurface" + <item android:color="@color/materialColorOnSurface" android:alpha="?attr/disabledAlpha" /> </selector> diff --git a/core/res/res/color/system_outline_disabled.xml b/core/res/res/color/system_outline_disabled.xml index 0a67ce3bf186..b5a6b6bd8e25 100644 --- a/core/res/res/color/system_outline_disabled.xml +++ b/core/res/res/color/system_outline_disabled.xml @@ -15,6 +15,6 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="?attr/materialColorOutline" + <item android:color="@color/materialColorOutline" android:alpha="?attr/disabledAlpha" /> </selector> diff --git a/core/res/res/color/system_surface_disabled.xml b/core/res/res/color/system_surface_disabled.xml index 2d7fe7d727be..157227241d44 100644 --- a/core/res/res/color/system_surface_disabled.xml +++ b/core/res/res/color/system_surface_disabled.xml @@ -15,6 +15,6 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="?attr/materialColorSurface" + <item android:color="@color/materialColorSurface" android:alpha="?attr/disabledAlpha" /> </selector> diff --git a/core/res/res/drawable-watch-v36/btn_background_material_filled_tonal.xml b/core/res/res/drawable/btn_background_material_filled_tonal_watch.xml index fbd697371329..69c467b19fa0 100644 --- a/core/res/res/drawable-watch-v36/btn_background_material_filled_tonal.xml +++ b/core/res/res/drawable/btn_background_material_filled_tonal_watch.xml @@ -18,7 +18,7 @@ android:color="?attr/colorControlHighlight"> <item> <shape android:shape="rectangle"> - <solid android:color="@color/btn_material_filled_tonal_background_color"/> + <solid android:color="@color/btn_material_filled_tonal_background_color_watch"/> <corners android:radius="@dimen/config_wearMaterial3_buttonCornerRadius"/> <size android:width="@dimen/btn_material_width" diff --git a/core/res/res/drawable-watch-v36/btn_background_material_filled.xml b/core/res/res/drawable/btn_background_material_filled_watch.xml index 6e74f64fea60..76ba84724f0b 100644 --- a/core/res/res/drawable-watch-v36/btn_background_material_filled.xml +++ b/core/res/res/drawable/btn_background_material_filled_watch.xml @@ -18,7 +18,7 @@ android:color="?attr/colorControlHighlight"> <item> <shape android:shape="rectangle"> - <solid android:color="@color/btn_material_filled_background_color"/> + <solid android:color="@color/btn_material_filled_background_color_watch"/> <corners android:radius="@dimen/config_wearMaterial3_buttonCornerRadius"/> <size android:width="@dimen/btn_material_width" diff --git a/core/res/res/drawable-watch-v36/btn_background_material_outlined.xml b/core/res/res/drawable/btn_background_material_outlined_watch.xml index 7bc40604dc25..16190aa0279f 100644 --- a/core/res/res/drawable-watch-v36/btn_background_material_outlined.xml +++ b/core/res/res/drawable/btn_background_material_outlined_watch.xml @@ -30,7 +30,7 @@ <corners android:radius="@dimen/config_wearMaterial3_buttonCornerRadius"/> <stroke android:width="1dp" - android:color="@color/btn_material_outlined_background_color" /> + android:color="@color/btn_material_outlined_background_color_watch" /> <size android:width="@dimen/btn_material_width" android:height="@dimen/btn_material_height" /> diff --git a/core/res/res/drawable-watch-v36/btn_background_material_text.xml b/core/res/res/drawable/btn_background_material_text_watch.xml index 145685c8095c..145685c8095c 100644 --- a/core/res/res/drawable-watch-v36/btn_background_material_text.xml +++ b/core/res/res/drawable/btn_background_material_text_watch.xml diff --git a/core/res/res/drawable-watch-v36/dialog_alert_button_background_negative.xml b/core/res/res/drawable/dialog_alert_button_background_negative_watch.xml index 0314bbec2b55..495fa4aabe3a 100644 --- a/core/res/res/drawable-watch-v36/dialog_alert_button_background_negative.xml +++ b/core/res/res/drawable/dialog_alert_button_background_negative_watch.xml @@ -17,7 +17,7 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - <solid android:color="@color/btn_material_filled_tonal_background_color"/> + <solid android:color="@color/btn_material_filled_tonal_background_color_watch"/> <corners android:radius="@dimen/config_wearMaterial3_bottomDialogCornerRadius" /> <size android:width="@dimen/dialog_btn_negative_width" diff --git a/core/res/res/drawable-watch-v36/dialog_alert_button_background_positive.xml b/core/res/res/drawable/dialog_alert_button_background_positive_watch.xml index 92262fb6d89d..20a4c0b6db90 100644 --- a/core/res/res/drawable-watch-v36/dialog_alert_button_background_positive.xml +++ b/core/res/res/drawable/dialog_alert_button_background_positive_watch.xml @@ -21,7 +21,7 @@ android:pivotX="50%" android:pivotY="50%"> <shape android:shape="rectangle"> - <solid android:color="@color/btn_material_filled_background_color"/> + <solid android:color="@color/btn_material_filled_background_color_watch"/> <corners android:radius="200dp" /> <size android:width="63dp" diff --git a/core/res/res/drawable-watch-v36/dialog_alert_button_negative.xml b/core/res/res/drawable/dialog_alert_button_negative_watch.xml index c155ba1ba077..1776962dbfaf 100644 --- a/core/res/res/drawable-watch-v36/dialog_alert_button_negative.xml +++ b/core/res/res/drawable/dialog_alert_button_negative_watch.xml @@ -15,8 +15,8 @@ --> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:drawable="@drawable/dialog_alert_button_background_negative"/> + <item android:drawable="@drawable/dialog_alert_button_background_negative_watch"/> <item - android:drawable="@drawable/ic_close" + android:drawable="@drawable/ic_close_watch" android:gravity="center" /> </layer-list>
\ No newline at end of file diff --git a/core/res/res/drawable-watch-v36/dialog_alert_button_positive.xml b/core/res/res/drawable/dialog_alert_button_positive_watch.xml index 01ab0734d8e8..ab08e2a1d67d 100644 --- a/core/res/res/drawable-watch-v36/dialog_alert_button_positive.xml +++ b/core/res/res/drawable/dialog_alert_button_positive_watch.xml @@ -15,8 +15,8 @@ --> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:drawable="@drawable/dialog_alert_button_background_positive"/> + <item android:drawable="@drawable/dialog_alert_button_background_positive_watch"/> <item - android:drawable="@drawable/ic_check" + android:drawable="@drawable/ic_check_watch" android:gravity="center" /> </layer-list>
\ No newline at end of file diff --git a/core/res/res/drawable/floating_popup_background.xml b/core/res/res/drawable/floating_popup_background.xml index 99acedf06e2d..7200954140b7 100644 --- a/core/res/res/drawable/floating_popup_background.xml +++ b/core/res/res/drawable/floating_popup_background.xml @@ -18,7 +18,7 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHighest"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest"/> <corners android:radius="?android:attr/dialogCornerRadius" /> </shape> diff --git a/core/res/res/drawable-watch-v36/ic_check.xml b/core/res/res/drawable/ic_check_watch.xml index 7b01e64ffdd3..2fc161fbbdb6 100644 --- a/core/res/res/drawable-watch-v36/ic_check.xml +++ b/core/res/res/drawable/ic_check_watch.xml @@ -19,7 +19,7 @@ android:height="28dp" android:viewportWidth="960" android:viewportHeight="960" - android:tint="@color/btn_material_filled_content_color"> - <path android:fillColor="@color/btn_material_filled_content_color" + android:tint="@color/btn_material_filled_content_color_watch"> + <path android:fillColor="@color/btn_material_filled_content_color_watch" android:pathData="M382,597.87L716.7,263.17Q730.37,249.5 748.76,249.5Q767.15,249.5 780.83,263.17Q794.5,276.85 794.5,295.62Q794.5,314.39 780.83,328.07L414.07,695.59Q400.39,709.26 382,709.26Q363.61,709.26 349.93,695.59L178.41,524.07Q164.74,510.39 165.12,491.62Q165.5,472.85 179.17,459.17Q192.85,445.5 211.62,445.5Q230.39,445.5 244.07,459.17L382,597.87Z"/> </vector> diff --git a/core/res/res/drawable-watch-v36/ic_close.xml b/core/res/res/drawable/ic_close_watch.xml index 1f3da367ac3f..55e721337f14 100644 --- a/core/res/res/drawable-watch-v36/ic_close.xml +++ b/core/res/res/drawable/ic_close_watch.xml @@ -19,7 +19,7 @@ android:height="28dp" android:viewportWidth="960" android:viewportHeight="960" - android:tint="@color/btn_material_filled_tonal_content_color"> - <path android:fillColor="@color/btn_material_filled_tonal_content_color" + android:tint="@color/btn_material_filled_tonal_content_color_watch"> + <path android:fillColor="@color/btn_material_filled_tonal_content_color_watch" android:pathData="M480,543.65L287.83,735.83Q275.15,748.5 256,748.5Q236.85,748.5 224.17,735.83Q211.5,723.15 211.5,704Q211.5,684.85 224.17,672.17L416.35,480L224.17,287.83Q211.5,275.15 211.5,256Q211.5,236.85 224.17,224.17Q236.85,211.5 256,211.5Q275.15,211.5 287.83,224.17L480,416.35L672.17,224.17Q684.85,211.5 704,211.5Q723.15,211.5 735.83,224.17Q748.5,236.85 748.5,256Q748.5,275.15 735.83,287.83L543.65,480L735.83,672.17Q748.5,684.85 748.5,704Q748.5,723.15 735.83,735.83Q723.15,748.5 704,748.5Q684.85,748.5 672.17,735.83L480,543.65Z"/> </vector> diff --git a/core/res/res/drawable/immersive_cling_bg.xml b/core/res/res/drawable/immersive_cling_bg.xml index de29c32390e1..b28a423ea06b 100644 --- a/core/res/res/drawable/immersive_cling_bg.xml +++ b/core/res/res/drawable/immersive_cling_bg.xml @@ -20,5 +20,5 @@ <corners android:bottomLeftRadius="28dp" android:bottomRightRadius="28dp"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainer" /> </shape> diff --git a/core/res/res/drawable/input_method_switch_button.xml b/core/res/res/drawable/input_method_switch_button.xml index 396d81ed87f6..1ee9b81a855a 100644 --- a/core/res/res/drawable/input_method_switch_button.xml +++ b/core/res/res/drawable/input_method_switch_button.xml @@ -30,7 +30,7 @@ <shape android:shape="rectangle"> <corners android:radius="28dp"/> <solid android:color="@color/transparent"/> - <stroke android:color="?attr/materialColorPrimary" + <stroke android:color="@color/materialColorPrimary" android:width="1dp"/> <padding android:left="16dp" android:top="8dp" diff --git a/core/res/res/drawable/input_method_switch_item_background.xml b/core/res/res/drawable/input_method_switch_item_background.xml index eb7a24691f37..ce5b6f92e539 100644 --- a/core/res/res/drawable/input_method_switch_item_background.xml +++ b/core/res/res/drawable/input_method_switch_item_background.xml @@ -29,7 +29,7 @@ <item android:state_activated="true"> <shape android:shape="rectangle"> <corners android:radius="28dp"/> - <solid android:color="?attr/materialColorSecondaryContainer"/> + <solid android:color="@color/materialColorSecondaryContainer"/> </shape> </item> </selector> diff --git a/core/res/res/drawable-watch-v36/progress_ring_wear_material3.xml b/core/res/res/drawable/progress_ring_watch.xml index 5c0e5f606d81..8250ee600a8f 100644 --- a/core/res/res/drawable-watch-v36/progress_ring_wear_material3.xml +++ b/core/res/res/drawable/progress_ring_watch.xml @@ -27,7 +27,7 @@ android:innerRadiusRatio="@dimen/progressbar_inner_radius_ratio" android:thickness="@dimen/progressbar_thickness" android:useLevel="false"> - <solid android:color="?attr/materialColorSurfaceContainer"/> + <solid android:color="@color/materialColorSurfaceContainer"/> </shape> </item> <item> @@ -36,7 +36,7 @@ android:innerRadiusRatio="@dimen/progressbar_inner_radius_ratio" android:thickness="@dimen/progressbar_thickness" android:useLevel="true"> - <solid android:color="?attr/materialColorPrimary"/> + <solid android:color="@color/materialColorPrimary"/> </shape> </item> </layer-list> diff --git a/core/res/res/layout-watch-v36/alert_dialog_wear_material3.xml b/core/res/res/layout-watch-v36/alert_dialog_wear_material3.xml deleted file mode 100644 index 8f7545690142..000000000000 --- a/core/res/res/layout-watch-v36/alert_dialog_wear_material3.xml +++ /dev/null @@ -1,113 +0,0 @@ -<!-- - ~ Copyright (C) 2024 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<!-- This layout is the AlertDialog template. It overrides the system layout with the same name. - Make sure to include all the existing id of the overridden alert_dialog_material.--> -<com.android.internal.widget.WatchListDecorLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/parentPanel" - android:layout_width="match_parent" - android:layout_height="match_parent"> - <ScrollView - android:id="@+id/scrollView" - android:fillViewport="true" - android:layout_width="match_parent" - android:layout_height="match_parent"> - <LinearLayout - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - <!-- Top Panel --> - <FrameLayout - android:paddingLeft="?dialogPreferredPadding" - android:paddingRight="?dialogPreferredPadding" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:id="@+id/topPanel" - android:minHeight="@dimen/dialog_list_padding_top_no_title"> - <include android:id="@+id/title_template" - android:layout_width="match_parent" - android:layout_height="wrap_content" - layout="@layout/alert_dialog_title_material"/> - </FrameLayout> - - <!-- Content Panel --> - <FrameLayout android:id="@+id/contentPanel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:clipToPadding="false"> - <TextView android:id="@+id/message" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_horizontal|top" - android:textAppearance="@style/TextAppearance.DeviceDefault.Body1" - android:paddingStart="?dialogPreferredPadding" - android:paddingEnd="?dialogPreferredPadding" - android:paddingTop="8dip" - android:paddingBottom="8dip"/> - </FrameLayout> - - <!-- Custom Panel, to replace content panel if needed --> - <FrameLayout android:id="@+id/customPanel" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:minHeight="64dp"> - <FrameLayout android:id="@+android:id/custom" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - </FrameLayout> - - <!-- Button Panel --> - <FrameLayout - android:id="@+id/buttonPanel" - android:minHeight="@dimen/dialog_list_padding_bottom_no_buttons" - android:layout_weight="1" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center"> - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom" - android:orientation="vertical" - android:paddingBottom="?dialogPreferredPadding" - android:measureWithLargestChild="true"> - <Button android:id="@+id/button2" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:gravity="center" - android:layout_weight="1" - style="@*android:style/Widget.DeviceDefault.Button.WearMaterial3"/> - <Button android:id="@+id/button3" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:gravity="center" - android:layout_weight="1" - style="?android:attr/buttonBarButtonStyle"/> - <Button android:id="@+id/button1" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="center" - android:gravity="center" - android:layout_weight="1" - style="@*android:style/Widget.DeviceDefault.Button.Filled"/> - </LinearLayout> - </FrameLayout> - </LinearLayout> - </ScrollView> -</com.android.internal.widget.WatchListDecorLayout> diff --git a/core/res/res/layout-watch-v36/alert_dialog_icon_button_wear_material3.xml b/core/res/res/layout/alert_dialog_icon_button_watch.xml index 407ec7a42740..e5bc86c7bc6c 100644 --- a/core/res/res/layout-watch-v36/alert_dialog_icon_button_wear_material3.xml +++ b/core/res/res/layout/alert_dialog_icon_button_watch.xml @@ -114,7 +114,7 @@ <ImageView android:layout_width="match_parent" android:layout_height="match_parent" - android:src="@drawable/dialog_alert_button_positive"/> + android:src="@drawable/dialog_alert_button_positive_watch"/> </FrameLayout> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/alert_dialog_title_watch.xml b/core/res/res/layout/alert_dialog_title_watch.xml new file mode 100644 index 000000000000..9c5148ffbd7a --- /dev/null +++ b/core/res/res/layout/alert_dialog_title_watch.xml @@ -0,0 +1,46 @@ +<!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:gravity="top|center_horizontal"> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:adjustViewBounds="true"> + + <ImageView + android:id="@+id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginBottom="8dp" + android:maxHeight="32dp" + android:maxWidth="32dp" + android:src="@null" /> + </FrameLayout> + + <TextView + android:id="@+id/alertTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/alertDialog_material_side_margin_title" + android:layout_marginEnd="@dimen/alertDialog_material_side_margin_title" + android:textAppearance="@style/TextAppearance.AlertDialog.Title" + android:gravity="center" /> +</LinearLayout>
\ No newline at end of file diff --git a/core/res/res/layout/alert_dialog_watch.xml b/core/res/res/layout/alert_dialog_watch.xml new file mode 100644 index 000000000000..cb81fc5976a0 --- /dev/null +++ b/core/res/res/layout/alert_dialog_watch.xml @@ -0,0 +1,138 @@ +<!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<!-- This layout is the AlertDialog template. It overrides the system layout with the same name. + Make sure to include all the existing id of the overridden alert_dialog_material.--> +<com.android.internal.widget.WatchListDecorLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/parentPanel" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ScrollView + android:id="@+id/scrollView" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fillViewport="true"> + + <requestFocus /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_marginStart="@dimen/alertDialog_material_side_margin" + android:layout_marginEnd="@dimen/alertDialog_material_side_margin" + android:gravity="center_vertical"> + + <!-- Top Spacer --> + <View + android:layout_width="match_parent" + android:layout_height="@dimen/alertDialog_material_top_margin" /> + + <!-- Top Panel --> + <FrameLayout + android:id="@+id/topPanel" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/dialog_list_padding_top_no_title"> + + <include + android:id="@+id/title_template" + layout="@layout/alert_dialog_title_watch" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </FrameLayout> + + <!-- Content Panel --> + <FrameLayout + android:id="@+id/contentPanel" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="12dp"> + + <TextView + android:id="@+id/message" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/alertDialog_material_side_margin_body" + android:layout_marginEnd="@dimen/alertDialog_material_side_margin_body" + android:textAppearance="@style/TextAppearance.AlertDialog.Body1" + android:gravity="center_horizontal|top" /> + </FrameLayout> + + <!-- Custom Panel, to replace content panel if needed --> + <FrameLayout + android:id="@+id/customPanel" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:minHeight="64dp"> + + <FrameLayout + android:id="@+android:id/custom" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </FrameLayout> + + <!-- Button Panel --> + <FrameLayout + android:id="@+id/buttonPanel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:minHeight="@dimen/dialog_list_padding_bottom_no_buttons"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_gravity="bottom" + android:orientation="vertical"> + <!-- Positive Button --> + <Button + android:id="@+id/button1" + style="@*android:style/Widget.DeviceDefault.Button.Filled" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center" + android:gravity="center" /> + <!--Neutral Button --> + <Button + android:id="@+id/button3" + style="@*android:style/Widget.DeviceDefault.Button.WearMaterial3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center" /> + <!-- Negative Button --> + <Button + android:id="@+id/button2" + style="@*android:style/Widget.DeviceDefault.Button.WearMaterial3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="4dp" + android:layout_gravity="center" + android:gravity="center" /> + </LinearLayout> + </FrameLayout> + + <!-- Bottom Spacer --> + <View + android:layout_width="match_parent" + android:layout_height="@dimen/alertDialog_material_bottom_margin" /> + + </LinearLayout> + </ScrollView> +</com.android.internal.widget.WatchListDecorLayout> diff --git a/core/res/res/layout/floating_popup_menu_button.xml b/core/res/res/layout/floating_popup_menu_button.xml index 0b3861cad252..f6e6adfb4b28 100644 --- a/core/res/res/layout/floating_popup_menu_button.xml +++ b/core/res/res/layout/floating_popup_menu_button.xml @@ -54,7 +54,7 @@ android:ellipsize="end" android:fontFamily="@*android:string/config_bodyFontFamily" android:textSize="@dimen/floating_toolbar_text_size" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:background="@null" android:focusable="false" android:focusableInTouchMode="false" diff --git a/core/res/res/layout/floating_popup_overflow_button.xml b/core/res/res/layout/floating_popup_overflow_button.xml index a51836b35057..5fd774f9c3af 100644 --- a/core/res/res/layout/floating_popup_overflow_button.xml +++ b/core/res/res/layout/floating_popup_overflow_button.xml @@ -26,4 +26,4 @@ android:paddingBottom="@dimen/floating_toolbar_menu_image_button_vertical_padding" android:scaleType="centerInside" android:background="?attr/actionBarItemBackground" - android:tint="?androidprv:attr/materialColorOnSurface" /> + android:tint="@androidprv:color/materialColorOnSurface" /> diff --git a/core/res/res/layout/immersive_mode_cling.xml b/core/res/res/layout/immersive_mode_cling.xml index 2cde9e648276..4e869b76b510 100644 --- a/core/res/res/layout/immersive_mode_cling.xml +++ b/core/res/res/layout/immersive_mode_cling.xml @@ -42,7 +42,7 @@ android:layout_marginTop="20dp" android:gravity="center_horizontal" android:text="@string/immersive_cling_title" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textSize="24sp" android:fontFamily="google-sans" /> @@ -54,7 +54,7 @@ android:paddingTop="14dp" android:gravity="center_horizontal" android:text="@string/immersive_cling_description" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:textSize="14sp" android:fontFamily="google-sans" /> @@ -72,7 +72,7 @@ android:minWidth="48dp" android:minHeight="48dp" android:text="@string/immersive_cling_positive" - android:textColor="?androidprv:attr/materialColorOnPrimary" + android:textColor="@androidprv:color/materialColorOnPrimary" android:textAllCaps="false" android:textSize="14sp" android:textFontWeight="500" diff --git a/core/res/res/layout/input_method_switch_item_divider.xml b/core/res/res/layout/input_method_switch_item_divider.xml index 4f8c963ff8cf..b56cfb7bf6bd 100644 --- a/core/res/res/layout/input_method_switch_item_divider.xml +++ b/core/res/res/layout/input_method_switch_item_divider.xml @@ -26,7 +26,7 @@ <View android:layout_width="match_parent" android:layout_height="1dp" - android:background="?attr/materialColorOutlineVariant" + android:background="@color/materialColorOutlineVariant" android:layout_marginStart="20dp" android:layout_marginEnd="24dp" android:importantForAccessibility="no"/> diff --git a/core/res/res/layout/input_method_switch_item_header.xml b/core/res/res/layout/input_method_switch_item_header.xml index f0080a630025..05c73d04d715 100644 --- a/core/res/res/layout/input_method_switch_item_header.xml +++ b/core/res/res/layout/input_method_switch_item_header.xml @@ -33,6 +33,6 @@ android:fontFamily="google-sans-text" android:textAppearance="?attr/textAppearance" android:accessibilityHeading="true" - android:textColor="?attr/materialColorPrimary"/> + android:textColor="@color/materialColorPrimary"/> </LinearLayout> diff --git a/core/res/res/layout/input_method_switch_item_new.xml b/core/res/res/layout/input_method_switch_item_new.xml index 7b241aff3fb1..368860848f5d 100644 --- a/core/res/res/layout/input_method_switch_item_new.xml +++ b/core/res/res/layout/input_method_switch_item_new.xml @@ -56,7 +56,7 @@ android:marqueeRepeatLimit="1" android:singleLine="true" android:fontFamily="google-sans-text" - android:textColor="?attr/materialColorOnSurfaceVariant" + android:textColor="@color/materialColorOnSurfaceVariant" android:textAppearance="?attr/textAppearanceListItemSecondary" android:textAllCaps="true" android:visibility="gone"/> diff --git a/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml b/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml index b25adaabf8e8..68eafee03848 100644 --- a/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml +++ b/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml @@ -18,14 +18,14 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/conversation_face_pile" - android:layout_width="@dimen/conversation_avatar_size" - android:layout_height="@dimen/conversation_avatar_size" + android:layout_width="@dimen/notification_2025_icon_circle_size" + android:layout_height="@dimen/notification_2025_icon_circle_size" android:forceHasOverlappingRendering="false" > <ImageView android:id="@+id/conversation_face_pile_top" - android:layout_width="@dimen/messaging_avatar_size" - android:layout_height="@dimen/messaging_avatar_size" + android:layout_width="@dimen/notification_2025_face_pile_avatar_size" + android:layout_height="@dimen/notification_2025_face_pile_avatar_size" android:scaleType="centerCrop" android:layout_gravity="end|top" android:background="@drawable/notification_icon_circle" @@ -43,8 +43,8 @@ /> <ImageView android:id="@+id/conversation_face_pile_bottom" - android:layout_width="@dimen/messaging_avatar_size" - android:layout_height="@dimen/messaging_avatar_size" + android:layout_width="@dimen/notification_2025_face_pile_avatar_size" + android:layout_height="@dimen/notification_2025_face_pile_avatar_size" android:scaleType="centerCrop" android:layout_gravity="center" android:background="@drawable/notification_icon_circle" diff --git a/core/res/res/layout/notification_2025_conversation_header.xml b/core/res/res/layout/notification_2025_conversation_header.xml new file mode 100644 index 000000000000..db79e79c96df --- /dev/null +++ b/core/res/res/layout/notification_2025_conversation_header.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<com.android.internal.widget.ConversationHeaderLinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/conversation_header" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingTop="@dimen/notification_2025_margin" + > + + <TextView + android:id="@+id/conversation_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title" + android:textSize="16sp" + android:singleLine="true" + android:layout_weight="1" + /> + + <TextView + android:id="@+id/app_name_divider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:text="@string/notification_header_divider_symbol" + android:singleLine="true" + android:visibility="gone" + /> + + <!-- App Name --> + <com.android.internal.widget.ObservableTextView + android:id="@+id/app_name_text" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:singleLine="true" + android:visibility="gone" + /> + + <TextView + android:id="@+id/time_divider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:text="@string/notification_header_divider_symbol" + android:singleLine="true" + android:visibility="gone" + /> + + <DateTimeView + android:id="@+id/time" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Time" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:showRelative="true" + android:singleLine="true" + android:visibility="gone" + /> + + <ViewStub + android:id="@+id/chronometer" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:layout="@layout/notification_template_part_chronometer" + android:visibility="gone" + /> + + <TextView + android:id="@+id/verification_divider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:text="@string/notification_header_divider_symbol" + android:singleLine="true" + android:visibility="gone" + /> + + <ImageView + android:id="@+id/verification_icon" + android:layout_width="@dimen/notification_verification_icon_size" + android:layout_height="@dimen/notification_verification_icon_size" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:baseline="10dp" + android:scaleType="fitCenter" + android:src="@drawable/ic_notifications_alerted" + android:visibility="gone" + /> + + <TextView + android:id="@+id/verification_text" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:layout_weight="100" + android:showRelative="true" + android:singleLine="true" + android:visibility="gone" + /> + + <ImageButton + android:id="@+id/feedback" + android:layout_width="@dimen/notification_feedback_size" + android:layout_height="@dimen/notification_feedback_size" + android:layout_marginStart="@dimen/notification_header_separating_margin" + android:background="?android:selectableItemBackgroundBorderless" + android:contentDescription="@string/notification_feedback_indicator" + android:baseline="13dp" + android:scaleType="fitCenter" + android:src="@drawable/ic_feedback_indicator" + android:visibility="gone" + /> + + <ImageView + android:id="@+id/phishing_alert" + android:layout_width="@dimen/notification_phishing_alert_size" + android:layout_height="@dimen/notification_phishing_alert_size" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:baseline="10dp" + android:scaleType="fitCenter" + android:src="@drawable/ic_dialog_alert_material" + android:visibility="gone" + android:contentDescription="@string/notification_phishing_alert_content_description" + /> + + <ImageView + android:id="@+id/profile_badge" + android:layout_width="@dimen/notification_badge_size" + android:layout_height="@dimen/notification_badge_size" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:baseline="10dp" + android:scaleType="fitCenter" + android:visibility="gone" + android:contentDescription="@string/notification_work_profile_content_description" + /> + + <ImageView + android:id="@+id/alerted_icon" + android:layout_width="@dimen/notification_alerted_size" + android:layout_height="@dimen/notification_alerted_size" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:baseline="10dp" + android:contentDescription="@string/notification_alerted_content_description" + android:scaleType="fitCenter" + android:src="@drawable/ic_notifications_alerted" + android:visibility="gone" + /> +</com.android.internal.widget.ConversationHeaderLinearLayout> diff --git a/core/res/res/layout/notification_2025_conversation_icon_container.xml b/core/res/res/layout/notification_2025_conversation_icon_container.xml index 90befd911bdf..7ec2450ceb71 100644 --- a/core/res/res/layout/notification_2025_conversation_icon_container.xml +++ b/core/res/res/layout/notification_2025_conversation_icon_container.xml @@ -18,32 +18,27 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/conversation_icon_container" - android:layout_width="@dimen/conversation_content_start" + android:layout_width="@dimen/notification_2025_content_margin_start" android:layout_height="wrap_content" android:gravity="start|top" android:clipChildren="false" android:clipToPadding="false" - android:paddingTop="20dp" - android:paddingBottom="16dp" android:importantForAccessibility="no" > <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_margin="@dimen/notification_2025_margin" android:clipChildren="false" android:clipToPadding="false" android:layout_gravity="top|center_horizontal" > - <!-- Big icon: 48x48, 12dp padding top, 16dp padding sides --> <com.android.internal.widget.CachingIconView android:id="@+id/conversation_icon" - android:layout_width="@dimen/conversation_avatar_size" - android:layout_height="@dimen/conversation_avatar_size" - android:layout_marginLeft="@dimen/conversation_badge_protrusion" - android:layout_marginRight="@dimen/conversation_badge_protrusion" - android:layout_marginBottom="@dimen/conversation_badge_protrusion" + android:layout_width="@dimen/notification_2025_icon_circle_size" + android:layout_height="@dimen/notification_2025_icon_circle_size" android:background="@drawable/notification_icon_circle" android:clipToOutline="true" android:scaleType="centerCrop" @@ -52,19 +47,25 @@ <ViewStub android:layout="@layout/notification_2025_conversation_face_pile_layout" - android:layout_width="@dimen/conversation_avatar_size" - android:layout_height="@dimen/conversation_avatar_size" - android:layout_marginLeft="@dimen/conversation_badge_protrusion" - android:layout_marginRight="@dimen/conversation_badge_protrusion" - android:layout_marginBottom="@dimen/conversation_badge_protrusion" + android:layout_width="@dimen/notification_2025_icon_circle_size" + android:layout_height="@dimen/notification_2025_icon_circle_size" android:id="@+id/conversation_face_pile" /> + <!-- The badge icon is visually aligned to the square containing the conversation icon, + but it has a border in the color of the background that is meant to delimit it from the + conversation icon. This border, although not visible due to the color, is technically + outside these bounds. + In order to align the badge properly to the bottom end of the square, we use a top/start + margin that is equal to (size of the conversation icon - size of the badge - size of the + border on one side). + --> <FrameLayout android:id="@+id/conversation_icon_badge" - android:layout_width="@dimen/conversation_icon_size_badged" - android:layout_height="@dimen/conversation_icon_size_badged" - android:layout_gravity="end|bottom" + android:layout_width="@dimen/notification_2025_conversation_icon_badge_size" + android:layout_height="@dimen/notification_2025_conversation_icon_badge_size" + android:layout_marginTop="@dimen/notification_2025_conversation_icon_badge_position" + android:layout_marginStart="@dimen/notification_2025_conversation_icon_badge_position" android:clipChildren="false" android:clipToPadding="false" > @@ -83,7 +84,7 @@ android:id="@+id/icon" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_margin="4dp" + android:layout_margin="@dimen/notification_2025_conversation_icon_badge_padding" android:layout_gravity="center" android:forceHasOverlappingRendering="false" /> diff --git a/core/res/res/layout/notification_2025_messaging_group.xml b/core/res/res/layout/notification_2025_messaging_group.xml index c1b491fc4b0e..ecaf0b9a785f 100644 --- a/core/res/res/layout/notification_2025_messaging_group.xml +++ b/core/res/res/layout/notification_2025_messaging_group.xml @@ -24,13 +24,13 @@ android:orientation="horizontal" > <FrameLayout android:id="@+id/message_icon_container" - android:layout_width="@dimen/conversation_content_start" + android:layout_width="@dimen/notification_2025_content_margin_start" android:layout_height="wrap_content"> <ImageView android:layout_gravity="top|center_horizontal" android:id="@+id/message_icon" - android:layout_width="@dimen/messaging_avatar_size" - android:layout_height="@dimen/messaging_avatar_size" + android:layout_width="@dimen/notification_2025_icon_circle_size" + android:layout_height="@dimen/notification_2025_icon_circle_size" android:background="@drawable/notification_icon_circle" android:clipToOutline="true" android:scaleType="centerCrop" @@ -58,14 +58,14 @@ </com.android.internal.widget.RemeasuringLinearLayout> <FrameLayout android:id="@+id/messaging_group_icon_container" - android:layout_width="@dimen/messaging_avatar_size" - android:layout_height="@dimen/messaging_avatar_size" + android:layout_width="@dimen/notification_2025_icon_circle_size" + android:layout_height="@dimen/notification_2025_icon_circle_size" android:layout_marginStart="12dp" android:visibility="gone"/> <FrameLayout android:id="@+id/messaging_group_sending_progress_container" android:layout_width="@dimen/messaging_group_sending_progress_size" - android:layout_height="@dimen/messaging_avatar_size" + android:layout_height="@dimen/notification_2025_icon_circle_size" android:layout_marginStart="12dp" android:layout_gravity="top" android:visibility="gone"> diff --git a/core/res/res/layout/notification_2025_template_collapsed_call.xml b/core/res/res/layout/notification_2025_template_collapsed_call.xml index 614444d6b2f0..c4bca1142ece 100644 --- a/core/res/res/layout/notification_2025_template_collapsed_call.xml +++ b/core/res/res/layout/notification_2025_template_collapsed_call.xml @@ -41,13 +41,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:layout_marginStart="@dimen/conversation_content_start" + android:layout_marginStart="@dimen/notification_2025_content_margin_start" android:orientation="vertical" android:paddingBottom="@dimen/notification_2025_margin" > <include - layout="@layout/notification_template_conversation_header" + layout="@layout/notification_2025_conversation_header" android:layout_width="wrap_content" android:layout_height="wrap_content" /> diff --git a/core/res/res/layout/notification_2025_template_conversation.xml b/core/res/res/layout/notification_2025_template_conversation.xml index 0c4c7fba90b1..f31f65e90950 100644 --- a/core/res/res/layout/notification_2025_template_conversation.xml +++ b/core/res/res/layout/notification_2025_template_conversation.xml @@ -60,11 +60,11 @@ <!-- Use layout_marginStart instead of paddingStart to work around strange measurement behavior on lower display densities. --> <include - layout="@layout/notification_template_conversation_header" + layout="@layout/notification_2025_conversation_header" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="2dp" - android:layout_marginStart="@dimen/conversation_content_start" + android:layout_marginStart="@dimen/notification_2025_content_margin_start" /> <!-- Messages --> @@ -86,7 +86,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/notification_content_margin" - android:layout_marginStart="@dimen/conversation_content_start" + android:layout_marginStart="@dimen/notification_2025_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" /> <include layout="@layout/notification_material_action_list" /> </com.android.internal.widget.RemeasuringLinearLayout> diff --git a/core/res/res/layout/notification_2025_template_expanded_call.xml b/core/res/res/layout/notification_2025_template_expanded_call.xml index 3ff71b78835d..2af0ec2972df 100644 --- a/core/res/res/layout/notification_2025_template_expanded_call.xml +++ b/core/res/res/layout/notification_2025_template_expanded_call.xml @@ -49,13 +49,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:layout_marginStart="@dimen/conversation_content_start" + android:layout_marginStart="@dimen/notification_2025_content_margin_start" android:orientation="vertical" android:minHeight="68dp" > <include - layout="@layout/notification_template_conversation_header" + layout="@layout/notification_2025_conversation_header" android:layout_width="wrap_content" android:layout_height="wrap_content" /> @@ -97,7 +97,7 @@ layout="@layout/notification_template_smart_reply_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/notification_content_margin_start" + android:layout_marginStart="@dimen/notification_2025_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" android:layout_marginTop="@dimen/notification_content_margin" /> diff --git a/core/res/res/layout/notification_2025_template_expanded_messaging.xml b/core/res/res/layout/notification_2025_template_expanded_messaging.xml index 5b5872657a43..e3c201465eb0 100644 --- a/core/res/res/layout/notification_2025_template_expanded_messaging.xml +++ b/core/res/res/layout/notification_2025_template_expanded_messaging.xml @@ -33,7 +33,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" - android:layout_marginTop="@dimen/notification_content_margin_top" + android:layout_marginTop="@dimen/notification_2025_header_height" android:clipChildren="false" android:orientation="vertical"> diff --git a/core/res/res/layout/notification_2025_text.xml b/core/res/res/layout/notification_2025_text.xml index 48b1083a5e53..474f6d2099c6 100644 --- a/core/res/res/layout/notification_2025_text.xml +++ b/core/res/res/layout/notification_2025_text.xml @@ -21,6 +21,7 @@ android:layout_height="@dimen/notification_text_height" android:layout_gravity="top" android:layout_marginTop="@dimen/notification_text_margin_top" + android:ellipsize="end" android:fadingEdge="horizontal" android:gravity="top" android:maxLines="1" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index c02c13cca79c..4d96adeb8e09 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -371,25 +371,25 @@ <string name="permlab_statusBarService" msgid="2523421018081437981">"wees die statusbalk"</string> <string name="permdesc_statusBarService" msgid="6652917399085712557">"Laat die app toe om die statusbalk te wees."</string> <string name="permlab_expandStatusBar" msgid="1184232794782141698">"vou statusbalk in of uit"</string> - <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"Laat die program toe om die statusbalk uit te vou of in te vou."</string> + <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"Laat die app toe om die statusbalk uit te vou of in te vou."</string> <string name="permlab_fullScreenIntent" msgid="4310888199502509104">"wys kennisgewings as volskermaktiwiteite op \'n geslote skerm"</string> - <string name="permdesc_fullScreenIntent" msgid="1100721419406643997">"Laat die program toe om kennisgewings as volskermaktiwiteite op \'n geslote toestel te wys"</string> + <string name="permdesc_fullScreenIntent" msgid="1100721419406643997">"Laat die app toe om kennisgewings as volskermaktiwiteite op \'n geslote toestel te wys"</string> <string name="permlab_install_shortcut" msgid="7451554307502256221">"installeer kortpaaie"</string> <string name="permdesc_install_shortcut" msgid="4476328467240212503">"Stel \'n app in staat om Tuisskerm-kortpaaie by te voeg sonder gebruikerinmenging."</string> <string name="permlab_uninstall_shortcut" msgid="295263654781900390">"deïnstalleer kortpaaie"</string> <string name="permdesc_uninstall_shortcut" msgid="1924735350988629188">"Laat die app toe om Tuisskerm-kortpaaie te verwyder sonder gebruikerinmenging."</string> <string name="permlab_processOutgoingCalls" msgid="4075056020714266558">"herlei uitgaande oproepe"</string> - <string name="permdesc_processOutgoingCalls" msgid="7833149750590606334">"Laat die program toe om te sien watter nommer tydens \'n uitgaande oproep geskakel word, met die opsie om die oproep na \'n ander nommer te herlei of die oproep heeltemal te beëindig."</string> + <string name="permdesc_processOutgoingCalls" msgid="7833149750590606334">"Laat die app toe om te sien watter nommer tydens \'n uitgaande oproep geskakel word, met die opsie om die oproep na \'n ander nommer te herlei of die oproep heeltemal te beëindig."</string> <string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"antwoord foonoproepe"</string> - <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"Laat die program toe om inkomende foonoproepe te antwoord."</string> + <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"Laat die app toe om inkomende foonoproepe te antwoord."</string> <string name="permlab_receiveSms" msgid="505961632050451881">"ontvang teksboodskappe (SMS)"</string> <string name="permdesc_receiveSms" msgid="1797345626687832285">"Laat die app toe om SMS-boodskappe te ontvang en te verwerk. Dit beteken dat die app boodskappe wat na jou toestel gestuur is, kan monitor of uitvee, sonder dat jy dit gesien het."</string> <string name="permlab_receiveMms" msgid="4000650116674380275">"ontvang teksboodskappe (MMS)"</string> - <string name="permdesc_receiveMms" msgid="958102423732219710">"Laat die program toe om MMS-boodskappe te ontvang en te verwerk. Dit beteken dat die program boodskappe wat na jou toestel gestuur is kan monitor of uitvee, sonder dat jy dit gesien het."</string> + <string name="permdesc_receiveMms" msgid="958102423732219710">"Laat die app toe om MMS-boodskappe te ontvang en te verwerk. Dit beteken dat die app boodskappe wat na jou toestel gestuur is kan monitor of uitvee, sonder dat jy dit gesien het."</string> <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Stuur seluitsendingboodskappe aan"</string> <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Laat die app toe om aan die seluitsendingmodule te bind om seluitsendingboodskappe aan te stuur wanneer hulle ontvang word. Seluitsendingwaarskuwings word in sommige liggings gelewer om jou oor noodsituasies te waarsku. Kwaadwillige apps kan met die werkverrigting of werking van jou toestel inmeng wanneer \'n noodseluitsending ontvang word."</string> <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Bestuur voortgaande oproepe"</string> - <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Stel \'n program in staat om besonderhede oor voortgaande oproepe op jou toestel te sien, en hierdie oproepe te beheer."</string> + <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Stel \'n app in staat om besonderhede oor voortgaande oproepe op jou toestel te sien, en hierdie oproepe te beheer."</string> <string name="permlab_accessLastKnownCellId" msgid="7638226620825665130">"Kry toegang tot laaste bekende selidentiteit."</string> <string name="permdesc_accessLastKnownCellId" msgid="6664621339249308857">"Laat ’n app toe om toegang tot die laaste bekende selidentiteit te kry wat deur telefonie verskaf is"</string> <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"lees seluitsending-boodskappe"</string> @@ -399,17 +399,17 @@ <string name="permlab_sendSms" msgid="7757368721742014252">"SMS-boodskappe te stuur en te bekyk"</string> <string name="permdesc_sendSms" msgid="6757089798435130769">"Laat die app toe om SMS-boodskappe te stuur. Dit kan tot onverwagse heffings lei. Kwaadwillige apps kan jou geld kos deur boodskappe sonder jou bevestiging te stuur."</string> <string name="permlab_readSms" msgid="5164176626258800297">"lees jou teksboodskappe (SMS of MMS)"</string> - <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"Hierdie program kan alle SMS\'e (teksboodskappe) wat op jou tablet geberg is, lees."</string> + <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"Hierdie app kan alle SMS\'e (teksboodskappe) wat op jou tablet geberg is, lees."</string> <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"Hierdie app kan alle SMS- (teks)-boodskappe lees wat op jou Android TV-toestel geberg is."</string> - <string name="permdesc_readSms" product="default" msgid="774753371111699782">"Hierdie program kan alle SMS\'e (teksboodskappe) wat op jou foon geberg is, lees."</string> + <string name="permdesc_readSms" product="default" msgid="774753371111699782">"Hierdie app kan alle SMS\'e (teksboodskappe) wat op jou foon geberg is, lees."</string> <string name="permlab_receiveWapPush" msgid="4223747702856929056">"ontvang teksboodskappe (WAP)"</string> <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"Laat die app toe om WAP-boodskappe te ontvang en te verwerk. Hierdie toestemming sluit ook in dat boodskappe wat na jou toestel gestuur is, gemonitor of uitgevee kan word, sonder dat jy dit gesien het."</string> <string name="permlab_getTasks" msgid="7460048811831750262">"haal lopende programme op"</string> - <string name="permdesc_getTasks" msgid="7388138607018233726">"Laat die program toe om inligting oor die huidig- en onlangslopende take op te haal. Dit kan moontlik die program toelaat om inligting oor watter programme op die toestel gebruik word, te ontdek."</string> + <string name="permdesc_getTasks" msgid="7388138607018233726">"Laat die app toe om inligting oor die huidig- en onlangslopende take op te haal. Dit kan moontlik die app toelaat om inligting oor watter apps op die toestel gebruik word, te ontdek."</string> <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"bestuur profiel- en toesteleienaars"</string> <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"Laat programme toe om die profieleienaars en die toesteleienaar te stel."</string> <string name="permlab_reorderTasks" msgid="7598562301992923804">"herrangskik lopende programme"</string> - <string name="permdesc_reorderTasks" msgid="8796089937352344183">"Laat die program toe om take na die voorgrond of agtergrond te skuif. Die program kan dit moontlik sonder jou insette doen."</string> + <string name="permdesc_reorderTasks" msgid="8796089937352344183">"Laat die app toe om take na die voorgrond of agtergrond te skuif. Die app kan dit moontlik sonder jou insette doen."</string> <string name="permlab_enableCarMode" msgid="893019409519325311">"aktiveer motormodus"</string> <string name="permdesc_enableCarMode" msgid="56419168820473508">"Laat die app toe om die motormodus te aktiveer."</string> <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"maak ander programme toe"</string> @@ -431,7 +431,7 @@ <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"Laat die app toe om dele daarvan in die geheue te laat voortbestaan. Dit kan geheue wat vir ander apps beskikbaar is, beperk en sodoende jou Android TV-toestel stadiger maak."</string> <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"Laat die app toe om dele van die app deurdringend in die geheue te hou. Dit kan geheue wat aan ander apps beskikbaar is, beperk, en die foon stadiger maak."</string> <string name="permlab_foregroundService" msgid="1768855976818467491">"laat loop voorgronddiens"</string> - <string name="permdesc_foregroundService" msgid="8720071450020922795">"Laat die program toe om van voorgronddienste gebruik te maak."</string> + <string name="permdesc_foregroundService" msgid="8720071450020922795">"Laat die app toe om van voorgronddienste gebruik te maak."</string> <string name="permlab_foregroundServiceCamera" msgid="7814751737955715297">"gebruik voorgronddienstipe “kamera”"</string> <string name="permdesc_foregroundServiceCamera" msgid="6973701931250595727">"Laat die app toe om die voorgronddienstipe “kamera” te gebruik"</string> <string name="permlab_foregroundServiceConnectedDevice" msgid="3019650546176872501">"gebruik voorgronddienstipe “gekoppelde toestel”"</string> @@ -461,27 +461,27 @@ <string name="permlab_foregroundServiceSpecialUse" msgid="7973536745876645082">"gebruik voorgronddienstipe “spesiale gebruik”"</string> <string name="permdesc_foregroundServiceSpecialUse" msgid="646713654541885919">"Laat die app toe om die voorgronddienstipe “spesiale gebruik” te gebruik"</string> <string name="permlab_getPackageSize" msgid="375391550792886641">"meet programberging-ruimte"</string> - <string name="permdesc_getPackageSize" msgid="742743530909966782">"Laat die program toe om sy kode, data en kasgroottes op te haal"</string> + <string name="permdesc_getPackageSize" msgid="742743530909966782">"Laat die app toe om sy kode, data en kasgroottes op te haal"</string> <string name="permlab_writeSettings" msgid="8057285063719277394">"verander stelsel-instellings"</string> - <string name="permdesc_writeSettings" msgid="8293047411196067188">"Laat die program toe om die stelsel se instellingsdata te verander. Kwaadwillige programme kan dalk jou stelsel se opstelling korrupteer."</string> + <string name="permdesc_writeSettings" msgid="8293047411196067188">"Laat die app toe om die stelsel se instellingsdata te verander. Kwaadwillige apps kan dalk jou stelsel se opstelling korrupteer."</string> <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"laat loop wanneer begin"</string> <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"Laat die app toe om self te begin sodra die stelsel geselflaai het. Dit maak dat dit langer neem vir die tablet om te begin, en dit laat die foon toe om die tablet stadiger te maak omdat dit altyd loop."</string> <string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"Laat die app toe om self te begin sodra die stelsel klaar geselflaai het. Dit kan dalk daartoe lei dat die toestel langer neem om jou Android TV-toestel te begin, en laat die app toe om die hele toestel stadiger te maak deur altyd te loop."</string> - <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"Laat die program toe om homself te begin so gou as moontlik nadat die stelsel laai. Dit maak dat dit langer neem vir die foon om te begin, en dit laat die foon toe om die foon stadiger te maak omdat dit altyd loop."</string> + <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"Laat die app toe om homself te begin so gou as moontlik nadat die stelsel laai. Dit maak dat dit langer neem vir die foon om te begin, en dit laat die foon toe om die foon stadiger te maak omdat dit altyd loop."</string> <string name="permlab_broadcastSticky" msgid="4552241916400572230">"Stuur klewerige uitsending"</string> <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"Laat die app toe om vaste uitsendings te stuur, wat agterbly nadat die uitsending klaar is. Oormatige gebruik kan die tablet stadig of onstabiel maak deurdat dit te veel geheue gebruik."</string> <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"Laat die app toe om vaste uitsendings wat agterbly nadat die uitsending eindig, te stuur. Oormatige gebruik kan jou Android TV-toestel stadig of onstabiel maak omdat dit veroorsaak dat jou toestel te veel geheue gebruik."</string> <string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"Laat die app toe om vaste uitsendings te stuur, wat agterbly nadat die uitsending klaar is. Oormatige gebruik kan die foon stadig of onstabiel maak deurdat dit te veel geheue gebruik."</string> <string name="permlab_readContacts" msgid="8776395111787429099">"lees jou kontakte"</string> - <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"Laat die program toe om data te lees oor jou kontakte wat op jou tablet geberg is. Programme sal ook toegang hê tot die rekeninge op jou tablet wat kontakte geskep het. Dit kan rekeninge insluit wat geskep is deur programme wat jy geïnstalleer het. Hierdie toestemming laat programme toe om jou kontakdata te stoor, en kwaadwillige programme kan kontakdata deel sonder dat jy dit weet."</string> - <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"Laat die program toe om data te lees oor jou kontakte wat op jou Android TV-toestel geberg is. Programme sal ook toegang hê tot die rekeninge op jou Android TV-toestel wat kontakte geskep het. Dit kan rekeninge insluit wat geskep is deur programme wat jy geïnstalleer het. Hierdie toestemming laat programme toe om jou kontakdata te stoor, en kwaadwillige programme kan kontakdata deel sonder dat jy dit weet."</string> - <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"Laat die program toe om data te lees oor jou kontakte wat op jou foon geberg is. Programme sal ook toegang hê tot die rekeninge op jou foon wat kontakte geskep het. Dit kan rekeninge insluit wat geskep is deur programme wat jy geïnstalleer het. Hierdie toestemming laat programme toe om jou kontakdata te stoor, en kwaadwillige programme kan kontakdata deel sonder dat jy dit weet."</string> + <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"Laat die app toe om data te lees oor jou kontakte wat op jou tablet geberg is. Apps sal ook toegang hê tot die rekeninge op jou tablet wat kontakte geskep het. Dit kan rekeninge insluit wat geskep is deur apps wat jy geïnstalleer het. Hierdie toestemming laat apps toe om jou kontakdata te stoor, en kwaadwillige apps kan kontakdata deel sonder dat jy dit weet."</string> + <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"Laat die app toe om data te lees oor jou kontakte wat op jou Android TV-toestel geberg is. Apps sal ook toegang hê tot die rekeninge op jou Android TV-toestel wat kontakte geskep het. Dit kan rekeninge insluit wat geskep is deur apps wat jy geïnstalleer het. Hierdie toestemming laat apps toe om jou kontakdata te stoor, en kwaadwillige apps kan kontakdata deel sonder dat jy dit weet."</string> + <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"Laat die app toe om data te lees oor jou kontakte wat op jou foon geberg is. Apps sal ook toegang hê tot die rekeninge op jou foon wat kontakte geskep het. Dit kan rekeninge insluit wat geskep is deur apps wat jy geïnstalleer het. Hierdie toestemming laat apps toe om jou kontakdata te stoor, en kwaadwillige apps kan kontakdata deel sonder dat jy dit weet."</string> <string name="permlab_writeContacts" msgid="8919430536404830430">"verander jou kontakte"</string> - <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"Laat die program toe om die data te wysig oor jou kontakte wat op jou tablet geberg is. Hierdie toestemming laat programme toe om kontakdata uit te vee."</string> - <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"Laat die program toe om die data te wysig oor jou kontakte wat op jou Android TV-toestel geberg is. Hierdie toestemming laat programme toe om kontakdata uit te vee."</string> - <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"Laat die program toe om die data te wysig oor jou kontakte wat op jou foon geberg is. Hierdie toestemming laat programme toe om kontakdata uit te vee."</string> + <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"Laat die app toe om die data te wysig oor jou kontakte wat op jou tablet geberg is. Hierdie toestemming laat apps toe om kontakdata uit te vee."</string> + <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"Laat die app toe om die data te wysig oor jou kontakte wat op jou Android TV-toestel geberg is. Hierdie toestemming laat apps toe om kontakdata uit te vee."</string> + <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"Laat die app toe om die data te wysig oor jou kontakte wat op jou foon geberg is. Hierdie toestemming laat apps toe om kontakdata uit te vee."</string> <string name="permlab_readCallLog" msgid="1739990210293505948">"lees oproeprekord"</string> - <string name="permdesc_readCallLog" msgid="8964770895425873433">"Hierdie program kan jou oproepgeskiedenis lees."</string> + <string name="permdesc_readCallLog" msgid="8964770895425873433">"Hierdie app kan jou oproepgeskiedenis lees."</string> <string name="permlab_writeCallLog" msgid="670292975137658895">"skryf oproeprekord"</string> <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"Laat die app toe om jou tablet se oproeprekord, insluitende data oor inkomende en uitgaande oproepe, te verander. Kwaadwillige apps kan dit gebruik om jou oproeprekord uit te vee of te verander."</string> <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Laat die app toe om jou Android TV-toestel se oproeprekord te wysig, insluitend data oor inkomende en uitgaande oproepe. Kwaadwillige apps kan dit gebruik om jou oproeprekord uit te vee of te wysig."</string> @@ -493,74 +493,74 @@ <string name="permlab_readCalendar" msgid="6408654259475396200">"Lees kalendergebeurtenisse en -besonderhede"</string> <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Hierdie app kan alle kalendergebeurtenisse lees wat op jou tablet geberg is of jou kalenderdata stoor."</string> <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Hierdie app kan alle kalendergeleenthede lees wat op jou Android TV-toestel geberg is of jou kalenderdata stoor."</string> - <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Hierdie program kan alle kalendergebeurtenisse lees wat op jou foon geberg is of jou kalenderdata stoor."</string> + <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Hierdie app kan alle kalendergebeurtenisse lees wat op jou foon geberg is of jou kalenderdata stoor."</string> <string name="permlab_writeCalendar" msgid="6422137308329578076">"voeg by of verander kalenderafsprake en stuur \'n e-pos aan gaste sonder eienaars se medewete"</string> - <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Hierdie program kan kalendergebeurtenisse op jou tablet byvoeg, verwyder of verander. Hierdie program kan boodskappe stuur wat lyk of dit van kalendereienaars af kom of gebeurtenisse verander sonder om hul eienaars in te lig."</string> - <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"Hierdie program kan kalendergeleenthede op jou Android TV-toestel byvoeg, verwyder of verander. Hierdie program kan boodskappe stuur wat lyk of dit van kalendereienaars af kom of geleenthede verander sonder om hul eienaars in kennis te stel."</string> + <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Hierdie app kan kalendergebeurtenisse op jou tablet byvoeg, verwyder of verander. Hierdie app kan boodskappe stuur wat lyk of dit van kalendereienaars af kom of gebeurtenisse verander sonder om hul eienaars in te lig."</string> + <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"Hierdie app kan kalendergeleenthede op jou Android TV-toestel byvoeg, verwyder of verander. Hierdie app kan boodskappe stuur wat lyk of dit van kalendereienaars af kom of geleenthede verander sonder om hul eienaars in kennis te stel."</string> <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"Hierdie app kan kalendergebeurtenisse op jou foon byvoeg, verwyder of verander. Hierdie app kan boodskappe stuur wat lyk of dit van kalendereienaars af kom of gebeurtenisse verander sonder om hul eienaars in te lig."</string> <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"Kry toegang tot ekstra liggingverskaffer-bevele"</string> <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"Gee die app toegang tot ekstra liggingverskaffer-bevele. Dit kan die app dalk toelaat om in te meng met die werking van die GPS of ander liggingbronne."</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"kry net op die voorgrond toegang tot presiese ligging"</string> - <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"Hierdie program kan jou presiese ligging van liggingdienste af kry terwyl die program gebruik word. Liggingdienste vir jou toestel moet aangeskakel wees vir die program om die ligging te kry. Dit kan batterygebruik verhoog."</string> + <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"Hierdie app kan jou presiese ligging van liggingdienste af kry terwyl die app gebruik word. Liggingdienste vir jou toestel moet aangeskakel wees vir die app om die ligging te kry. Dit kan batterygebruik verhoog."</string> <string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"kry benaderde ligging net op die voorgrond"</string> - <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"Hierdie program kan jou benaderde ligging van liggingdienste af kry terwyl die program gebruik word. Liggingdienste vir jou toestel moet aangeskakel wees vir die program om die ligging te kry."</string> + <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"Hierdie app kan jou benaderde ligging van liggingdienste af kry terwyl die app gebruik word. Liggingdienste vir jou toestel moet aangeskakel wees vir die app om die ligging te kry."</string> <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"kry ligging op die agtergrond"</string> - <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"Hierdie program kan op enige tydstip toegang tot ligging kry, selfs wanneer die program nie gebruik word nie."</string> + <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"Hierdie app kan op enige tydstip toegang tot ligging kry, selfs wanneer die app nie gebruik word nie."</string> <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"verander jou klankinstellings"</string> - <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"Laat die program toe om globale klankinstellings soos volume en watter luidspreker vir uitvoer gebruik word, te verander."</string> + <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"Laat die app toe om globale klankinstellings soos volume en watter luidspreker vir uitvoer gebruik word, te verander."</string> <string name="permlab_recordAudio" msgid="1208457423054219147">"neem klank op"</string> - <string name="permdesc_recordAudio" msgid="5857246765327514062">"Hierdie die program kan oudio met die mikrofoon opneem terwyl die program gebruik word."</string> + <string name="permdesc_recordAudio" msgid="5857246765327514062">"Hierdie die app kan oudio met die mikrofoon opneem terwyl die app gebruik word."</string> <string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"neem oudio op die agtergrond op"</string> - <string name="permdesc_recordBackgroundAudio" msgid="1992623135737407516">"Hierdie program kan enige tyd oudio met die mikrofoon opneem."</string> + <string name="permdesc_recordBackgroundAudio" msgid="1992623135737407516">"Hierdie app kan enige tyd oudio met die mikrofoon opneem."</string> <string name="permlab_detectScreenCapture" msgid="4447042362828799433">"bespeur skermskote van appvensters"</string> <string name="permdesc_detectScreenCapture" msgid="3485784917960342284">"Hierdie app sal ingelig word as ’n skermskoot geneem word terwyl die app gebruik word."</string> <string name="permlab_sim_communication" msgid="176788115994050692">"stuur bevele na die SIM"</string> <string name="permdesc_sim_communication" msgid="4179799296415957960">"Laat die app toe om bevele na die SIM te stuur. Dit is baie gevaarlik."</string> <string name="permlab_activityRecognition" msgid="1782303296053990884">"herken fisieke aktiwiteit"</string> - <string name="permdesc_activityRecognition" msgid="8667484762991357519">"Hierdie program kan jou fisieke aktiwiteit herken."</string> + <string name="permdesc_activityRecognition" msgid="8667484762991357519">"Hierdie app kan jou fisieke aktiwiteit herken."</string> <string name="permlab_camera" msgid="6320282492904119413">"neem foto\'s en video\'s"</string> - <string name="permdesc_camera" msgid="5240801376168647151">"Hierdie program kan met die kamera foto\'s neem en video\'s opneem terwyl die program gebruik word."</string> + <string name="permdesc_camera" msgid="5240801376168647151">"Hierdie app kan met die kamera foto\'s neem en video\'s opneem terwyl die app gebruik word."</string> <string name="permlab_backgroundCamera" msgid="7549917926079731681">"neem foto\'s en video\'s op die agtergrond"</string> - <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"Hierdie program kan enige tyd met die kamera foto\'s neem en video\'s opneem."</string> + <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"Hierdie app kan enige tyd met die kamera foto\'s neem en video\'s opneem."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"Gee \'n app of diens toegang tot stelselkameras om foto\'s en video\'s te neem"</string> - <string name="permdesc_systemCamera" msgid="5938360914419175986">"Hierdie bevoorregte of stelselprogram kan enige tyd met \'n stelselkamera foto\'s neem en video\'s opneem. Vereis dat die program ook die android.permission.CAMERA-toestemming het"</string> - <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Laat \'n program of diens toe om terugbeloproepe te ontvang oor kameratoestelle wat oopgemaak of toegemaak word."</string> - <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"Hierdie program kan terugbeloproepe ontvang wanneer enige kameratoestel oopgemaak (deur watter program) of toegemaak word."</string> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"Hierdie bevoorregte of stelselapp kan enige tyd met \'n stelselkamera foto\'s neem en video\'s opneem. Vereis dat die app ook die android.permission.CAMERA-toestemming het"</string> + <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Laat \'n app of diens toe om terugbeloproepe te ontvang oor kameratoestelle wat oopgemaak of toegemaak word."</string> + <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"Hierdie app kan terugbeloproepe ontvang wanneer enige kameratoestel oopgemaak (deur watter app) of toegemaak word."</string> <string name="permlab_cameraHeadlessSystemUser" msgid="680194666834500050">"Laat ’n app of diens toe om toegang tot die kamera te verkry as ’n stelselgebruiker sonder koppelvlak."</string> <string name="permdesc_cameraHeadlessSystemUser" msgid="6963163319710996412">"Hierdie app het toegang tot die kamera as ’n stelselgebruiker sonder koppelvlak."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"beheer vibrasie"</string> - <string name="permdesc_vibrate" msgid="8733343234582083721">"Laat die program toe om die vibrator te beheer."</string> - <string name="permdesc_vibrator_state" msgid="7050024956594170724">"Stel die program in staat om toegang tot die vibreerderstand te kry."</string> + <string name="permdesc_vibrate" msgid="8733343234582083721">"Laat die app toe om die vibrator te beheer."</string> + <string name="permdesc_vibrator_state" msgid="7050024956594170724">"Stel die app in staat om toegang tot die vibreerderstand te kry."</string> <string name="permlab_callPhone" msgid="1798582257194643320">"skakel foonnommers direk"</string> <string name="permdesc_callPhone" msgid="7892422187827695656">"Laat die app toe om foonnommers sonder jou insae te bel. Dit kan onvoorsiene heffings of oproepe tot gevolg hê. Neem kennis dat dit nie die app toelaat om noodnommers te bel nie. Kwaadwillige apps kan jou geld kos deur oproepe te maak sonder jou bevestiging of diensverskafferkodes te bel wat veroorsaak dat inkomende oproepe outomaties na ’n ander nommer aangestuur word."</string> <string name="permlab_accessImsCallService" msgid="442192920714863782">"toegang tot kitsboodskapoproepdiens"</string> <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Laat die app toe om die kitsboodskapdiens te gebruik om oproepe sonder jou ingryping te maak."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lees foonstatus en identiteit"</string> - <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Laat die program toe om toegang tot die foonfunksies van die toestel te verkry. Hierdie toestemming laat die program toe om te bepaal wat die foonnommer en toestel-IDs is, of die oproep aan die gang is, en die afgeleë nommer wat deur \'n oproep verbind word."</string> + <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Laat die app toe om toegang tot die foonfunksies van die toestel te verkry. Hierdie toestemming laat die app toe om te bepaal wat die foonnommer en toestel-IDs is, of die oproep aan die gang is, en die afgeleë nommer wat deur \'n oproep verbind word."</string> <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lees basiese telefoniestatus en -identiteit"</string> - <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Gee die program toegang tot die toestel se basiese telefoniekenmerke."</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Gee die app toegang tot die toestel se basiese telefoniekenmerke."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"roeteer oproepe deur die stelsel"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Laat die app toe om sy oproepe deur die stelsel te stuur om die oproepervaring te verbeter."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"sien en beheer oproepe deur die stelsel."</string> - <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"Laat die program toe om deurlopende oproepe op die toestel te sien en te beheer. Dit sluit inligting in soos oproepnommers vir oproepe en die toedrag van die oproepe."</string> + <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"Laat die app toe om deurlopende oproepe op die toestel te sien en te beheer. Dit sluit inligting in soos oproepnommers vir oproepe en die toedrag van die oproepe."</string> <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"vrygestel van beperkings op oudio-opnames"</string> - <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"Stel die program vry van beperkings om oudio op te neem."</string> + <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"Stel die app vry van beperkings om oudio op te neem."</string> <string name="permlab_acceptHandover" msgid="2925523073573116523">"gaan voort met \'n oproep uit \'n ander app"</string> <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"Laat die app toe om \'n oproep voort te sit wat in \'n ander app begin is."</string> <string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"lees foonnommers"</string> - <string name="permdesc_readPhoneNumbers" msgid="7368652482818338871">"Laat die program toe om toegang tot die toestel se foonnommers te kry."</string> + <string name="permdesc_readPhoneNumbers" msgid="7368652482818338871">"Laat die app toe om toegang tot die toestel se foonnommers te kry."</string> <string name="permlab_wakeLock" product="automotive" msgid="1904736682319375676">"hou motorskerm aan"</string> <string name="permlab_wakeLock" product="tablet" msgid="1527660973931694000">"verhoed dat tablet slaap"</string> <string name="permlab_wakeLock" product="tv" msgid="2856941418123343518">"keer dat jou Android TV-toestel slaap"</string> <string name="permlab_wakeLock" product="default" msgid="569409726861695115">"verhoed foon om te slaap"</string> - <string name="permdesc_wakeLock" product="automotive" msgid="5995045369683254571">"Laat die program toe om die motorskerm aan te hou."</string> + <string name="permdesc_wakeLock" product="automotive" msgid="5995045369683254571">"Laat die app toe om die motorskerm aan te hou."</string> <string name="permdesc_wakeLock" product="tablet" msgid="2441742939101526277">"Laat die app toe om die tablet te keer om te slaap."</string> <string name="permdesc_wakeLock" product="tv" msgid="2329298966735118796">"Laat die app toe om te keer dat jou Android TV-toestel slaap."</string> <string name="permdesc_wakeLock" product="default" msgid="3689523792074007163">"Laat die app toe om die foon te keer om te slaap."</string> <string name="permlab_transmitIr" msgid="8077196086358004010">"versend infrarooi"</string> <string name="permdesc_transmitIr" product="tablet" msgid="5884738958581810253">"Laat die app toe om die tablet se infrarooisender te gebruik."</string> <string name="permdesc_transmitIr" product="tv" msgid="3278506969529173281">"Laat die app toe om jou Android TV-toestel se infrarooisender te gebruik."</string> - <string name="permdesc_transmitIr" product="default" msgid="8484193849295581808">"Laat die program toe om die foon se infrarooisender te gebruik."</string> + <string name="permdesc_transmitIr" product="default" msgid="8484193849295581808">"Laat die app toe om die foon se infrarooisender te gebruik."</string> <string name="permlab_setWallpaper" msgid="6959514622698794511">"stel muurpapier"</string> <string name="permdesc_setWallpaper" msgid="2973996714129021397">"Laat die app toe om die stelsel se muurpapier te stel."</string> <string name="permlab_accessHiddenProfile" msgid="8607094418491556823">"Kry toegang tot versteekte profiele"</string> @@ -569,7 +569,7 @@ <string name="permdesc_setWallpaperHints" msgid="6257053376990044668">"Laat die app toe om die stelsel se muurpapier se groottewenke te stel."</string> <string name="permlab_setTimeZone" msgid="7922618798611542432">"stel tydsone"</string> <string name="permdesc_setTimeZone" product="tablet" msgid="1788868809638682503">"Laat die app toe om die tablet se tydsone te verander."</string> - <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"Laat die program toe om jou Android TV-toestel se tydsone te verander."</string> + <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"Laat die app toe om jou Android TV-toestel se tydsone te verander."</string> <string name="permdesc_setTimeZone" product="default" msgid="4611828585759488256">"Laat die app toe om die foon se tydsone te verander."</string> <string name="permlab_getAccounts" msgid="5304317160463582791">"soek rekeninge op die toestel"</string> <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"Laat die app toe om die lys van rekeninge wat aan die tablet bekend is, te kry. Dit kan moontlik enige rekeninge wat geskep is deur apps wat jy geïnstalleer het, insluit."</string> @@ -578,7 +578,7 @@ <string name="permlab_accessNetworkState" msgid="2349126720783633918">"bekyk netwerkverbindings"</string> <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"Laat die app toe om inligting oor netwerkverbindings, soos watter netwerke bestaan en gekoppel is, te sien."</string> <string name="permlab_createNetworkSockets" msgid="3224420491603590541">"verkry volle netwerktoegang"</string> - <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"Laat die program toe om netwerksokke te skep en gepasmaakte netwerkprotokolle te gebruik. Die blaaier en ander programme verskaf reeds die middele waardeur data na die internet gestuur kan word, so hierdie toestemming word nie vereis om data na die internet te stuur nie."</string> + <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"Laat die app toe om netwerksokke te skep en gepasmaakte netwerkprotokolle te gebruik. Die blaaier en ander apps verskaf reeds die middele waardeur data na die internet gestuur kan word, so hierdie toestemming word nie vereis om data na die internet te stuur nie."</string> <string name="permlab_changeNetworkState" msgid="8945711637530425586">"verander netwerkverbinding"</string> <string name="permdesc_changeNetworkState" msgid="649341947816898736">"Laat die app toe om die status van netwerkkonnektiwiteit te verander."</string> <string name="permlab_changeTetherState" msgid="9079611809931863861">"verander verbinde konnektiwiteit"</string> @@ -586,15 +586,15 @@ <string name="permlab_accessWifiState" msgid="5552488500317911052">"bekyk Wi-Fi-verbindings"</string> <string name="permdesc_accessWifiState" msgid="6913641669259483363">"Laat die app toe om inligting oor wi-fi-netwerke, soos of wi-fi geaktiveer is en die name van gekoppelde wi-fi-toestelle, te sien."</string> <string name="permlab_changeWifiState" msgid="7947824109713181554">"koppel en ontkoppel van Wi-Fi"</string> - <string name="permdesc_changeWifiState" msgid="7170350070554505384">"Laat die program toe om te koppel aan en te ontkoppel van Wi-Fi-toegangspunte en om veranderings aan Wi-Fi-netwerke se toestelopstellings te maak."</string> + <string name="permdesc_changeWifiState" msgid="7170350070554505384">"Laat die app toe om te koppel aan en te ontkoppel van wi-fi-toegangspunte en om veranderings aan wi-fi-netwerke se toestelopstellings te maak."</string> <string name="permlab_changeWifiMulticastState" msgid="285626875870754696">"laat Wi-Fi-multisendontvangs toe"</string> <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="191079868596433554">"Laat die app toe om pakkies te ontvang wat met behulp van multisaai-adresse na alle toestelle op \'n wi-fi-netwerk gestuur is, nie net jou tablet nie. Dit gebruik meer krag as die nie-multisaaimodus."</string> <string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"Laat die app toe om pakkette te ontvang wat met multi-uitsendingadresse na alle toestelle op \'n wi-fi-netwerk gestuur is, nie net jou Android TV-toestel nie. Dit gebruik meer krag as nie-multi-uitsendingmodus."</string> - <string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"Laat die program toe om pakkies te ontvang wat met behulp van multisaai-adresse na alle toestelle op \'n Wi-Fi-netwerk gestuur is, nie net jou foon nie. Dit gebruik meer krag as die nie-multisaaimodus."</string> + <string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"Laat die app toe om pakkies te ontvang wat met behulp van multisaai-adresse na alle toestelle op \'n Wi-Fi-netwerk gestuur is, nie net jou foon nie. Dit gebruik meer krag as die nie-multisaaimodus."</string> <string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"gaan in by Bluetooth-instellings"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"Laat die app toe om die plaaslike Bluetooth-tablet op te stel, en om met afstandbeheer toestelle saam te bind."</string> <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"Laat die app toe om Bluetooth op jou Android TV-toestel op te stel, en om afgeleë toestelle te ontdek en met hulle saam te bind."</string> - <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"Laat die program toe om die plaaslike Bluetooth-foon op te stel en te ontdek en met afgeleë toestelle saam te bind."</string> + <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"Laat die app toe om die plaaslike Bluetooth-foon op te stel en te ontdek en met toestelle op ’n afstand saam te bind."</string> <string name="permlab_accessWimaxState" msgid="7029563339012437434">"koppel aan en ontkoppel van WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"Laat die app toe om te bepaal of WiMAX geaktiveer is en of enige WiMAX-netwerke gekoppel is."</string> <string name="permlab_changeWimaxState" msgid="6223305780806267462">"verander WiMAX-status"</string> @@ -603,24 +603,24 @@ <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"Laat die app toe om die foon aan WiMAX-netwerke te koppel en daarvan te ontkoppel."</string> <string name="permlab_bluetooth" msgid="586333280736937209">"bind saam met Bluetooth-toestelle"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Laat die app toe om die opstelling van Bluetooth op die tablet te sien, en om verbindings met saamgebinde toestelle te maak en te aanvaar."</string> - <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Laat die program toe om die opstelling van Bluetooth op jou Android TV-toestel te bekyk, en om verbindings met saamgebinde toestelle te maak en te aanvaar."</string> + <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Laat die app toe om die opstelling van Bluetooth op jou Android TV-toestel te bekyk, en om verbindings met saamgebinde toestelle te maak en te aanvaar."</string> <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Laat die app toe om die opstelling van die Bluetooth op die foon te sien, en om verbindings met saamgebinde toestelle te maak en te aanvaar."</string> <string name="permlab_bluetooth_scan" msgid="5402587142833124594">"ontdek en bind Bluetooth-toestelle in die omtrek saam"</string> - <string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Laat die program toe om Bluetooth-toestelle in die omtrek te ontdek en saam te bind"</string> + <string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Laat die app toe om Bluetooth-toestelle in die omtrek te ontdek en saam te bind"</string> <string name="permlab_bluetooth_connect" msgid="6657463246355003528">"koppel aan saamgebinde Bluetooth-toestelle"</string> - <string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Laat die program toe om aan saamgebinde Bluetooth-toestelle te koppel"</string> + <string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Laat die app toe om aan saamgebinde Bluetooth-toestelle te koppel"</string> <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"adverteer op Bluetooth-toestelle in die omtrek"</string> - <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Laat die program toe om op Bluetooth-toestelle in die omtrek te adverteer"</string> + <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Laat die app toe om op Bluetooth-toestelle in die omtrek te adverteer"</string> <string name="permlab_uwb_ranging" msgid="8141915781475770665">"bepaal relatiewe posisie tussen ultrabreëbandtoestelle in die omtrek"</string> - <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Laat die program toe om relatiewe posisie tussen ultrabreëbandtoestelle in die omtrek te bepaal"</string> + <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Laat die app toe om relatiewe posisie tussen ultrabreëbandtoestelle in die omtrek te bepaal"</string> <string name="permlab_nearby_wifi_devices" msgid="392774237063608500">"om interaksie met wi‑fi-toestelle in die omtrek te hê"</string> - <string name="permdesc_nearby_wifi_devices" msgid="3054307728646332906">"Laat die program toe om op toestelle in die omtrek te adverteer, aan hulle te koppel en hul relatiewe posisie te bepaal"</string> + <string name="permdesc_nearby_wifi_devices" msgid="3054307728646332906">"Laat die app toe om op toestelle in die omtrek te adverteer, aan hulle te koppel en hul relatiewe posisie te bepaal"</string> <string name="permlab_ranging" msgid="2854543350668593390">"bepaal relatiewe posisie tussen toestelle in die omtrek"</string> <string name="permdesc_ranging" msgid="6703905535621521710">"Laat die app toe om relatiewe posisie tussen toestelle in die omtrek te bepaal"</string> <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Voorkeur-NFC-betalingdiensinligting"</string> - <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Laat die program toe om voorkeur-NFC-betalingdiensinligting soos geregistreerde hulpmiddels en roetebestemming te kry."</string> + <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Laat die app toe om voorkeur-NFC-betalingdiensinligting soos geregistreerde hulpmiddels en roetebestemming te kry."</string> <string name="permlab_nfc" msgid="1904455246837674977">"beheer kortveldkommunikasie"</string> - <string name="permdesc_nfc" msgid="8352737680695296741">"Laat die program toe om met kortveldkommunikasie- (NFC) merkers, kaarte en lesers te kommunikeer."</string> + <string name="permdesc_nfc" msgid="8352737680695296741">"Laat die app toe om met kortveldkommunikasie- (NFC) merkers, kaarte en lesers te kommunikeer."</string> <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Veilige Element-transaksiegeval"</string> <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Laat die app toe om inligting te ontvang oor transaksies wat op ’n Veilige Element plaasvind."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"deaktiveer jou skermslot"</string> @@ -628,17 +628,17 @@ <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"versoek skermslot-kompleksiteit"</string> <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Laat die app toe om die skermslot-kompleksiteitvlak (hoog, medium, laag of geen) te leer, wat die moontlike omvang van die lengte en soort skermslot aandui. Hierdie app kan ook aan gebruikers voorstel dat hulle die skermslot na \'n sekere vlak opdateer, maar gebruikers kan dit uit vrye wil ignoreer en weggaan. Let daarop dat die skermslot nie in skoonteks geberg word nie en die app dus nie die presiese wagwoord ken nie."</string> <string name="permlab_postNotification" msgid="4875401198597803658">"wys kennisgewings"</string> - <string name="permdesc_postNotification" msgid="5974977162462877075">"Laat die program toe om kennisgewings te wys"</string> + <string name="permdesc_postNotification" msgid="5974977162462877075">"Laat die app toe om kennisgewings te wys"</string> <string name="permlab_turnScreenOn" msgid="219344053664171492">"skakel die skerm aan"</string> <string name="permdesc_turnScreenOn" msgid="4394606875897601559">"Laat die app toe om die skerm aan te skakel."</string> <string name="permlab_useBiometric" msgid="6314741124749633786">"gebruik biometriese hardeware"</string> - <string name="permdesc_useBiometric" msgid="7502858732677143410">"Laat die program toe om biometriese hardeware vir stawing te gebruik"</string> + <string name="permdesc_useBiometric" msgid="7502858732677143410">"Laat die app toe om biometriese hardeware vir stawing te gebruik"</string> <string name="permlab_manageFingerprint" msgid="7432667156322821178">"bestuur vingerafdrukhardeware"</string> <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"Laat die app toe om metodes te benut om vingerafdruktemplate vir gebruik by te voeg en uit te vee."</string> <string name="permlab_useFingerprint" msgid="1001421069766751922">"gebruik vingerafdrukhardeware"</string> <string name="permdesc_useFingerprint" msgid="412463055059323742">"Laat die app toe om vingerafdrukhardeware vir stawing te gebruik"</string> <string name="permlab_audioWrite" msgid="8501705294265669405">"wysig jou musiekversameling"</string> - <string name="permdesc_audioWrite" msgid="8057399517013412431">"Laat die program toe om jou musiekversameling te wysig."</string> + <string name="permdesc_audioWrite" msgid="8057399517013412431">"Laat die app toe om jou musiekversameling te wysig."</string> <string name="permlab_videoWrite" msgid="5940738769586451318">"wysig jou videoversameling"</string> <string name="permdesc_videoWrite" msgid="6124731210613317051">"Laat die app toe om jou videoversameling te wysig."</string> <string name="permlab_imagesWrite" msgid="1774555086984985578">"wysig jou fotoversameling"</string> @@ -778,7 +778,7 @@ <string name="permlab_readVisualUserSelect" msgid="5516204215354667586">"lees prent- en videolêers wat gebruiker in gedeelde berging kies"</string> <string name="permdesc_readVisualUserSelect" msgid="8027174717714968217">"Laat die app toe om prent- en videolêers te lees wat jy in jou gedeelde berging kies."</string> <string name="permlab_sdcardWrite" msgid="4863021819671416668">"verander of vee jou gedeelde berging se inhoud uit"</string> - <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Laat die program toe om jou gedeelde berging se inhoud te skryf."</string> + <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Laat die app toe om jou gedeelde berging se inhoud te skryf."</string> <string name="permlab_use_sip" msgid="8250774565189337477">"maak en/of ontvang SIP-oproepe"</string> <string name="permdesc_use_sip" msgid="3590270893253204451">"Laat die app toe om SIP-oproepe te maak en te ontvang."</string> <string name="permlab_register_sim_subscription" msgid="1653054249287576161">"registreer nuwe telekommunikasie-SIM-verbindings"</string> @@ -800,7 +800,7 @@ <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"verander verrekening van netwerkgebruik"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"Laat die app toe om te verander hoe netwerkgebruik teenoor apps gemeet word. Nie vir gebruik deur normale apps nie."</string> <string name="permlab_accessNotifications" msgid="7130360248191984741">"kry toegang tot kennisgewings"</string> - <string name="permdesc_accessNotifications" msgid="761730149268789668">"Laat die program toe om kennisgewings op te haal, te bestudeer en te verwyder, insluitende die kennisgewings wat deur ander programme geplaas is."</string> + <string name="permdesc_accessNotifications" msgid="761730149268789668">"Laat die app toe om kennisgewings op te haal, te bestudeer en te verwyder, insluitende die kennisgewings wat deur ander apps geplaas is."</string> <string name="permlab_bindNotificationListenerService" msgid="5848096702733262458">"bind aan \'n kennisgewingluisteraardiens"</string> <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"Laat die houer toe om aan die top-koppelvlak van \'n kennisgewingluisteraardiens te bind. Behoort nooit vir gewone programme nodig te wees nie."</string> <string name="permlab_bindConditionProviderService" msgid="5245421224814878483">"verbind met \'n toestandverskafferdiens"</string> @@ -824,15 +824,15 @@ <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"verbind aan diensverskafferdienste"</string> <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Laat die houer toe om aan diensverskafferdienste te verbind. Behoort nooit vir normale programme nodig te wees nie."</string> <string name="permlab_access_notification_policy" msgid="5524112842876975537">"verkry toegang tot Moenie Steur Nie"</string> - <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Laat die program toe om Moenie Steur Nie-opstelling te lees en skryf."</string> + <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Laat die app toe om Moenie Steur Nie-opstelling te lees en skryf."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"begin kyk van toestemminggebruik"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Laat die houer toe om die toestemminggebruik vir \'n app te begin. Dit behoort nooit vir normale apps nodig te wees nie."</string> <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"begin Bekyk Toestemmingbesluite"</string> <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Laat die houer toe om skerm te begin om toestemmingbesluite na te gaan. Behoort nooit vir normale programme nodig te wees nie."</string> <string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"begin Bekyk Programkenmerke"</string> - <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Laat die houer toe om die kenmerke-inligting vir \'n program te begin bekyk."</string> + <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Laat die houer toe om die kenmerke-inligting vir \'n app te begin bekyk."</string> <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"kry toegang tot sensordata teen \'n hoë monsternemingkoers"</string> - <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Laat die program toe om monsters van sensordata teen \'n hoër koers as 200 Hz te neem"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Laat die app toe om monsters van sensordata teen \'n hoër koers as 200 Hz te neem"</string> <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"dateer app sonder gebruikerhandeling op"</string> <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Laat die houer toe om die app wat dit voorheen sonder gebruikhandeling geïnstalleer het, op te dateer"</string> <string name="permlab_writeVerificationStateE2eeContactKeys" msgid="3990742344778360457">"dateer die verifikasiestatus van E2EE-kontaksleutels op wat deur ander apps besit word"</string> @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"oor <xliff:g id="COUNT">%d</xliff:g> u."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"oor <xliff:g id="COUNT">%d</xliff:g> d."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"oor <xliff:g id="COUNT">%d</xliff:g> j."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> m. gelede"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> uur gelede"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> d. gelede"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> jr. gelede"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> uur"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> jr."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"oor <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"oor <xliff:g id="COUNT">%d</xliff:g> uur"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"oor <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"oor <xliff:g id="COUNT">%d</xliff:g> jr."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min. gelede"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> uur gelede"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> d. gelede"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> jr. gelede"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuut gelede}other{# minute gelede}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# uur gelede}other{# uur gelede}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dag gelede}other{# dae gelede}}"</string> @@ -1272,7 +1256,7 @@ <string name="whichSendToApplication" msgid="77101541959464018">"Stuur met"</string> <string name="whichSendToApplicationNamed" msgid="3385686512014670003">"Stuur met %1$s"</string> <string name="whichSendToApplicationLabel" msgid="3543240188816513303">"Stuur"</string> - <string name="whichHomeApplication" msgid="8276350727038396616">"Kies \'n Tuis-program"</string> + <string name="whichHomeApplication" msgid="8276350727038396616">"Kies \'n Tuis-app"</string> <string name="whichHomeApplicationNamed" msgid="5855990024847433794">"Gebruik %1$s as Tuis"</string> <string name="whichHomeApplicationLabel" msgid="8907334282202933959">"Vang prent vas"</string> <string name="whichImageCaptureApplication" msgid="2737413019463215284">"Vang prent vas met"</string> @@ -1293,7 +1277,7 @@ <string name="aerr_close" msgid="3398336821267021852">"Maak toe"</string> <string name="aerr_mute" msgid="2304972923480211376">"Demp totdat toestel herbegin"</string> <string name="aerr_wait" msgid="3198677780474548217">"Wag"</string> - <string name="aerr_close_app" msgid="8318883106083050970">"Maak program toe"</string> + <string name="aerr_close_app" msgid="8318883106083050970">"Maak app toe"</string> <string name="anr_title" msgid="7290329487067300120"></string> <string name="anr_activity_application" msgid="8121716632960340680">"<xliff:g id="APPLICATION">%2$s</xliff:g> reageer nie"</string> <string name="anr_activity_process" msgid="3477362583767128667">"<xliff:g id="ACTIVITY">%1$s</xliff:g> reageer nie"</string> @@ -1311,7 +1295,7 @@ <string name="screen_compat_mode_hint" msgid="4032272159093750908">"Heraktiveer hierdie in Stelselinstellings > Programme > Afgelaai."</string> <string name="unsupported_display_size_message" msgid="7265211375269394699">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie die huidige skermgrootte-instelling nie en sal dalk onverwags reageer."</string> <string name="unsupported_display_size_show" msgid="980129850974919375">"Wys altyd"</string> - <string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g> is gebou vir \'n onversoenbare weergawe van die Android-bedryfstelsel en kan dalk op \'n onverwagte manier reageer. \'n Opgedateerde weergawe van die program is dalk beskikbaar."</string> + <string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g> is gebou vir \'n onversoenbare weergawe van die Android-bedryfstelsel en kan dalk op \'n onverwagte manier reageer. \'n Opgedateerde weergawe van die app is dalk beskikbaar."</string> <string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"Wys altyd"</string> <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"Kyk vir opdatering"</string> <string name="smv_application" msgid="3775183542777792638">"Die app <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) het sy selfopgelegde StrictMode-beleid oortree."</string> @@ -1541,7 +1525,7 @@ <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"vra om batteryoptimerings te ignoreer"</string> <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"Laat \'n app toe om toestemming te vra om batteryoptimerings vir daardie app te ignoreer."</string> <string name="permlab_queryAllPackages" msgid="2928450604653281650">"navraag oor alle pakkette"</string> - <string name="permdesc_queryAllPackages" msgid="5339069855520996010">"Laat \'n program toe om alle geïnstalleerde pakette te sien."</string> + <string name="permdesc_queryAllPackages" msgid="5339069855520996010">"Laat \'n app toe om alle geïnstalleerde pakette te sien."</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"Klop twee keer vir zoembeheer"</string> <string name="gadget_host_error_inflating" msgid="2449961590495198720">"Kon nie legstuk byvoeg nie."</string> <string name="ime_action_go" msgid="5536744546326495436">"Gaan"</string> @@ -2040,10 +2024,10 @@ <string name="language_picker_section_all" msgid="1985809075777564284">"Alle tale"</string> <string name="region_picker_section_all" msgid="756441309928774155">"Allle streke"</string> <string name="locale_search_menu" msgid="6258090710176422934">"Soek"</string> - <string name="app_suspended_title" msgid="888873445010322650">"Program is nie beskikbaar nie"</string> + <string name="app_suspended_title" msgid="888873445010322650">"App is nie beskikbaar nie"</string> <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> is nie nou onmiddellik beskikbaar nie. Dit word bestuur deur <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Kom meer te wete"</string> - <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Hervat program"</string> + <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Hervat app"</string> <string name="work_mode_off_title" msgid="6367463960165135829">"Hervat werkapps?"</string> <string name="work_mode_turn_on" msgid="5316648862401307800">"Hervat"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Noodgeval"</string> @@ -2051,7 +2035,7 @@ <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Stel skermslot"</string> <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Stel ’n skermslot op dié toestel om jou privaat ruimte te gebruik"</string> <string name="private_space_set_up_screen_lock_for_reset" msgid="7817091386408432097">"Stel ’n skermslot op dié toestel om privaat ruimte uit te vee"</string> - <string name="app_blocked_title" msgid="7353262160455028160">"Program is nie beskikbaar nie"</string> + <string name="app_blocked_title" msgid="7353262160455028160">"App is nie beskikbaar nie"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is nie op die oomblik beskikbaar nie."</string> <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> is nie beskikbaar nie"</string> <string name="app_streaming_blocked_title_for_permission_dialog" msgid="3805704317624448487">"Toestemmingsversoek is onderdruk"</string> @@ -2163,7 +2147,7 @@ <string name="shortcut_disabled_reason_unknown" msgid="753074793553599166">"Kortpad is gedeaktiveer"</string> <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEΪNSTALLEER"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"MAAK TOG OOP"</string> - <string name="harmful_app_warning_title" msgid="8794823880881113856">"Skadelike program is bespeur"</string> + <string name="harmful_app_warning_title" msgid="8794823880881113856">"Skadelike app is bespeur"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wil <xliff:g id="APP_2">%2$s</xliff:g>-skyfies wys"</string> <string name="screenshot_edit" msgid="7408934887203689207">"Wysig"</string> <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Oproepe en kennisgewings sal vibreer"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index ad5bbcbb8cbe..ecfce08a6ae8 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"በ<xliff:g id="COUNT">%d</xliff:g> ሰ ውስጥ"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"በ<xliff:g id="COUNT">%d</xliff:g> ቀ ውስጥ"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"በ<xliff:g id="COUNT">%d</xliff:g> ዓ ውስጥ"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"ከ<xliff:g id="COUNT">%d</xliff:g>ደ በፊት"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"ከ<xliff:g id="COUNT">%d</xliff:g>ሰዓ በፊት"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"ከ<xliff:g id="COUNT">%d</xliff:g>ቀ በፊት"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"ከ<xliff:g id="COUNT">%d</xliff:g>ዓ በፊት"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>ደቂቃ"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>ሰዓ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>ቀ"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>ዓመ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"በ<xliff:g id="COUNT">%d</xliff:g>ደቂቃ ውስጥ"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"በ<xliff:g id="COUNT">%d</xliff:g>ሰዓ ውስጥ"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"በ<xliff:g id="COUNT">%d</xliff:g>ቀ ውስጥ"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"በ<xliff:g id="COUNT">%d</xliff:g>ዓመ ውስጥ"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"ከ<xliff:g id="COUNT">%d</xliff:g>ደቂቃ በፊት"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"ከ<xliff:g id="COUNT">%d</xliff:g>ሰዓ በፊት"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"ከ<xliff:g id="COUNT">%d</xliff:g>ቀ በፊት"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"ከ<xliff:g id="COUNT">%d</xliff:g>ዓመ በፊት"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{ከ# ደቂቃ በፊት}one{# ደቂቃ በፊት}other{# ደቂቃዎች በፊት}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{ከ# ሰዓት በፊት}one{ከ# ሰዓት በፊት}other{ከ# ሰዓታት በፊት}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{ከ# ቀን በፊት}one{ከ# ቀን በፊት}other{ከ# ቀናት በፊት}}"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 8cb64c5712f8..dc047acfc03b 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1162,38 +1162,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"خلال <xliff:g id="COUNT">%d</xliff:g> ساعة"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"خلال <xliff:g id="COUNT">%d</xliff:g> يوم"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"خلال <xliff:g id="COUNT">%d</xliff:g> سنة"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"قبل <xliff:g id="COUNT">%d</xliff:g> دقيقة"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"قبل <xliff:g id="COUNT">%d</xliff:g> ساعة"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"قبل <xliff:g id="COUNT">%d</xliff:g> يوم"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"قبل <xliff:g id="COUNT">%d</xliff:g> سنة"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> دقيقة"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ساعة"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> يوم"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> سنة"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"خلال <xliff:g id="COUNT">%d</xliff:g> دقيقة"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"خلال <xliff:g id="COUNT">%d</xliff:g> ساعة"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"خلال <xliff:g id="COUNT">%d</xliff:g> يوم"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"خلال <xliff:g id="COUNT">%d</xliff:g> سنة"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"قبل <xliff:g id="COUNT">%d</xliff:g> دقيقة"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"قبل <xliff:g id="COUNT">%d</xliff:g> ساعة"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"قبل <xliff:g id="COUNT">%d</xliff:g> يوم"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"قبل <xliff:g id="COUNT">%d</xliff:g> سنة"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{قبل دقيقة واحدة}zero{قبل # دقيقة}two{قبل دقيقتين}few{قبل # دقائق}many{قبل # دقيقة}other{قبل # دقيقة}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{قبل ساعة واحدة}zero{قبل # ساعة}two{قبل ساعتين}few{قبل # ساعات}many{قبل # ساعة}other{قبل # ساعة}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{قبل يوم واحد}zero{قبل # يوم}two{قبل يومين}few{قبل # أيام}many{قبل # يومًا}other{قبل # يوم}}"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 4214ebee2e47..402394d07770 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ঘণ্টাত"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>দিনত"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> বছৰত"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> মিনিট পূৰ্বে"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ঘণ্টা পূৰ্বে"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> দিন পূৰ্বে"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> বছৰৰ পূৰ্বে"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> মিনিট"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ঘণ্টা"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> দিন"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> বছৰ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> মিনিটত"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> ঘণ্টাত"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> দিনত"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> বছৰত"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> মিনিট পূৰ্বে"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ঘণ্টা পূৰ্বে"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> দিন পূৰ্বে"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> বছৰৰ পূৰ্বে"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# মিনিট পূৰ্বে}one{# মিনিট পূৰ্বে}other{# মিনিট পূৰ্বে}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ঘণ্টা পূৰ্বে}one{# ঘণ্টা পূৰ্বে}other{# ঘণ্টা পূৰ্বে}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# দিন পূর্বে}one{# দিন পূৰ্বে}other{# দিন পূৰ্বে}}"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index d4389dc0a467..c696e63ed1af 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> s ərzində"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> g ərzində"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> il ərzində"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> il əvvəl"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> saat"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> gün"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> il"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə ərzində"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> saat ərzində"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> gün ərzində"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> il ərzində"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> il əvvəl"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# dəqiqə əvvəl}other{# dəqiqə əvvəl}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# saat əvvəl}other{# saat əvvəl}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# gün əvvəl}other{# gün əvvəl}}"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 911eede993cd..dc393463af87 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> s"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> god"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"pre <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"pre <xliff:g id="COUNT">%d</xliff:g> s"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"pre <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"pre <xliff:g id="COUNT">%d</xliff:g> g"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> s"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> god"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"za <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"za <xliff:g id="COUNT">%d</xliff:g> s"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"za <xliff:g id="COUNT">%d</xliff:g> god"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"pre <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"pre <xliff:g id="COUNT">%d</xliff:g> s"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"pre <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"pre <xliff:g id="COUNT">%d</xliff:g> god"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Pre # minut}one{Pre # minut}few{Pre # minuta}other{Pre # minuta}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Pre # sat}one{Pre # sat}few{Pre # sata}other{Pre # sati}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Pre # dan}one{Pre # dan}few{Pre # dana}other{Pre # dana}}"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 0165929df175..d1a2104dfa25 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1160,38 +1160,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"праз <xliff:g id="COUNT">%d</xliff:g> гадз"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"праз <xliff:g id="COUNT">%d</xliff:g> сут"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"праз <xliff:g id="COUNT">%d</xliff:g> г."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> хв таму"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> гадз таму"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> сут таму"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> г. таму"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> хв"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> гадз"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> сут"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> г."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"праз <xliff:g id="COUNT">%d</xliff:g> хв"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"праз <xliff:g id="COUNT">%d</xliff:g> гадз"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"праз <xliff:g id="COUNT">%d</xliff:g> сут"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"праз <xliff:g id="COUNT">%d</xliff:g> г."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> хв таму"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> гадз таму"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> сут таму"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> г. таму"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# хвіліну таму}one{# хвіліну таму}few{# хвіліны таму}many{# хвілін таму}other{# хвіліны таму}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# гадзіну таму}one{# гадзіну таму}few{# гадзіны таму}many{# гадзін таму}other{# гадзіны таму}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# дзень таму}one{# дзень таму}few{# дні таму}many{# дзён таму}other{# дня таму}}"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 1b6867557302..3332195635c4 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"след <xliff:g id="COUNT">%d</xliff:g> ч"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"след <xliff:g id="COUNT">%d</xliff:g> д"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"след <xliff:g id="COUNT">%d</xliff:g> г."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"преди <xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"преди <xliff:g id="COUNT">%d</xliff:g> ч"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"преди <xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"преди <xliff:g id="COUNT">%d</xliff:g> г."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ч"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> г."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"след <xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"след <xliff:g id="COUNT">%d</xliff:g> ч"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"след <xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"след <xliff:g id="COUNT">%d</xliff:g> г."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"преди <xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"преди <xliff:g id="COUNT">%d</xliff:g> ч"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"преди <xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"преди <xliff:g id="COUNT">%d</xliff:g> г."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{преди # минута}other{преди # минути}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{преди # час}other{преди # часа}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{преди # ден}other{преди # дни}}"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 3b832e0b4299..2b19c573e04a 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>ঘণ্টার মধ্যে"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>দিনের মধ্যে"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>বছরের মধ্যে"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>মিনিট আগে"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>ঘণ্টা আগে"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>দিন আগে"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>বছর আগে"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>মিনিট"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>ঘণ্টা"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>দিন"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>বছর"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g>মিনিটের মধ্যে"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g>ঘণ্টার মধ্যে"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g>দিনের মধ্যে"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g>বছরের মধ্যে"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>মিনিট আগে"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>ঘন্টা আগে"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>দিন আগে"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>বছর আগে"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# মিনিট আগে}one{# মিনিট আগে}other{# মিনিট আগে}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ঘণ্টা আগে}one{# ঘণ্টা আগে}other{# ঘণ্টা আগে}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# দিন আগে}one{# দিন আগে}other{# দিন আগে}}"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 64ded2d17e8f..c49e337d6fe5 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> g"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"prije <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"prije <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"prije <xliff:g id="COUNT">%d</xliff:g> dan(a)"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"prije <xliff:g id="COUNT">%d</xliff:g> god."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> dan(a)"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> god."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"za <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"za <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"za <xliff:g id="COUNT">%d</xliff:g> dan(a)"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"za <xliff:g id="COUNT">%d</xliff:g> god."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"prije <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"prije <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"prije <xliff:g id="COUNT">%d</xliff:g> dan(a)"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"prije <xliff:g id="COUNT">%d</xliff:g> god."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Prije # min}one{Prije # min}few{Prije # min}other{Prije # min}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Prije # h}one{Prije # h}few{Prije # h}other{Prije # h}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Prije # dan}one{Prije # dan}few{Prije # dana}other{Prije # dana}}"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index d11941af34d5..3bb58a59945a 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> a"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"fa <xliff:g id="COUNT">%d</xliff:g> m"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"fa <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"fa <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"fa <xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> hora"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> dia"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> any"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> hora"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> dia"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> any"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"fa <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"fa <xliff:g id="COUNT">%d</xliff:g> hora"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"fa <xliff:g id="COUNT">%d</xliff:g> dia"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"fa <xliff:g id="COUNT">%d</xliff:g> any"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Fa # minut}many{Fa # minuts}other{Fa # minuts}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Fa # hora}many{Fa # hores}other{Fa # hores}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Fa # dia}many{Fa # dies}other{Fa # dies}}"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 50c3e6a62787..8038a296ab7a 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1160,38 +1160,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> r"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"před <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"před <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"před <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"před <xliff:g id="COUNT">%d</xliff:g> r"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> r"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"za <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"za <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"za <xliff:g id="COUNT">%d</xliff:g> r"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"před <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"před <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"před <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"před <xliff:g id="COUNT">%d</xliff:g> r"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{před # minutou}few{před # minutami}many{před # minuty}other{před # minutami}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{před # hodinou}few{před # hodinami}many{před # hodiny}other{před # hodinami}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Před # dnem}few{před # dny}many{před # dne}other{před # dny}}"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 9bd5f70d6e6f..5403cce30944 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"om <xliff:g id="COUNT">%d</xliff:g> t."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"om <xliff:g id="COUNT">%d</xliff:g> d."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"om <xliff:g id="COUNT">%d</xliff:g> år"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min. siden"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> t. siden"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> d. siden"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> år siden"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> t."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> år"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"om <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"om <xliff:g id="COUNT">%d</xliff:g> t."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"om <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"om <xliff:g id="COUNT">%d</xliff:g> år"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min. siden"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> t. siden"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> d. siden"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> år siden"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{For # minut siden}one{For # minut siden}other{For # minutter siden}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# time siden}one{# time siden}other{# timer siden}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{1 dag siden}one{1 dag siden}other{# dag siden}}"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 06cadd54c07c..ca542ba8722b 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g> Std."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g> T"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> J"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"vor <xliff:g id="COUNT">%d</xliff:g> Min."</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"vor <xliff:g id="COUNT">%d</xliff:g> Std."</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"vor <xliff:g id="COUNT">%d</xliff:g> Tg."</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"vor <xliff:g id="COUNT">%d</xliff:g> J."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> Min."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> Std."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> Tg."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> J."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"in <xliff:g id="COUNT">%d</xliff:g> Min."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"in <xliff:g id="COUNT">%d</xliff:g> Std."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"in <xliff:g id="COUNT">%d</xliff:g> Tg."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"in <xliff:g id="COUNT">%d</xliff:g> J."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"vor <xliff:g id="COUNT">%d</xliff:g> Min."</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"vor <xliff:g id="COUNT">%d</xliff:g> Std."</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"vor <xliff:g id="COUNT">%d</xliff:g> Tg."</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"vor <xliff:g id="COUNT">%d</xliff:g> J."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Vor # Minute}other{Vor # Minuten}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Vor # Stunde}other{Vor # Stunden}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Vor # Tag}other{Vor # Tagen}}"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index b4b70d8545ef..1aae63feb546 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"σε <xliff:g id="COUNT">%d</xliff:g>ώ."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"σε <xliff:g id="COUNT">%d</xliff:g>η."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"σε <xliff:g id="COUNT">%d</xliff:g>έτ."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> λ. πριν"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ω. πριν"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> η. πριν"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> χρ. πριν"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> λ."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ω."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> η."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> χρ."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"σε <xliff:g id="COUNT">%d</xliff:g> λ."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"σε <xliff:g id="COUNT">%d</xliff:g> ω."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"σε <xliff:g id="COUNT">%d</xliff:g> η."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"σε <xliff:g id="COUNT">%d</xliff:g> χρ."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> λ. πριν"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ω. πριν"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> η. πριν"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> χρ. πριν"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# λεπτό πριν}other{Πριν από # λεπτά}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Πριν από # ώρα}other{Πριν από # ώρες}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Πριν από # ημέρα}other{Πριν από # ημέρες}}"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 58037eb83069..3c5e02ad6322 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g>d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> y"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>m ago"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>h ago"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>d ago"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>y ago"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"in <xliff:g id="COUNT">%d</xliff:g>min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"in <xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"in <xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"in <xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>min ago"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>hr ago"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>d ago"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>yr ago"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minute ago}other{# minutes ago}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hour ago}other{# hours ago}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# day ago}other{# days ago}}"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 43b6ba65ff35..cf02080120e5 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g>d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> y"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>m ago"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>h ago"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>d ago"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>y ago"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"in <xliff:g id="COUNT">%d</xliff:g>min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"in <xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"in <xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"in <xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>min ago"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>hr ago"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>d ago"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>yr ago"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minute ago}other{# minutes ago}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hour ago}other{# hours ago}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# day ago}other{# days ago}}"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 1a0f8e42d341..30b60117cd19 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g>d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> y"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>m ago"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>h ago"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>d ago"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>y ago"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"in <xliff:g id="COUNT">%d</xliff:g>min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"in <xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"in <xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"in <xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>min ago"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>hr ago"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>d ago"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>yr ago"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minute ago}other{# minutes ago}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hour ago}other{# hours ago}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# day ago}other{# days ago}}"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 3c739206ec7c..867e8c52a4cf 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g> años"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min atrás"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> h atrás"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> d atrás"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> años atrás"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> años"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"en <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"en <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"en <xliff:g id="COUNT">%d</xliff:g> año"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min atrás"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> h atrás"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> d atrás"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> años atrás"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}many{Hace # de horas}other{Hace # horas}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}many{Hace # de días}other{Hace # días}}"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index a81af9f3acd2..1f10c5d0fb88 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g>a"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"hace <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"hace <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"hace <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"hace <xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"en <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"en <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"en <xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"hace <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"hace <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"hace <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"hace <xliff:g id="COUNT">%d</xliff:g> a"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}many{Hace # horas}other{Hace # horas}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}many{Hace # días}other{Hace # días}}"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index c5cadcf594b5..58f5f20fe35f 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> h pärast"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> p pärast"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> a pärast"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min tagasi"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> h tagasi"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> p tagasi"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> a tagasi"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> p"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> min pärast"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> h pärast"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> p pärast"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> a pärast"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min tagasi"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> h tagasi"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> p tagasi"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> a tagasi"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minut tagasi}other{# minutit tagasi}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# tund tagasi}other{# tundi tagasi}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# päev tagasi}other{# päeva tagasi}}"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index a0b2cc311214..ab3b66b666d7 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> h barru"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> eg. barru"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ur. barru"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"Duela <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"Duela <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"Duela <xliff:g id="COUNT">%d</xliff:g> egun"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"Duela <xliff:g id="COUNT">%d</xliff:g> urte"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> egun"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> urte"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> min barru"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> h barru"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> egun barru"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> urte barru"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"Duela <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"Duela <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"Duela <xliff:g id="COUNT">%d</xliff:g> egun"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"Duela <xliff:g id="COUNT">%d</xliff:g> urte"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Duela # minutu}other{Duela # minutu}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Duela # ordu}other{Duela # ordu}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Duela # egun}other{Duela # egun}}"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 4d3f1a3651d5..954f6ba6ae1b 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"تا <xliff:g id="COUNT">%d</xliff:g> ساعت دیگر"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"تا <xliff:g id="COUNT">%d</xliff:g> روز دیگر"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"تا <xliff:g id="COUNT">%d</xliff:g> سال دیگر"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> دقیقه پیش"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ساعت پیش"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> روز پیش"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> سال پیش"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> دقیقه"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ساعت"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> روز"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> سال"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> دقیقه دیگر"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> ساعت دیگر"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> روز دیگر"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> سال دیگر"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> دقیقه پیش"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ساعت پیش"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> روز پیش"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> سال پیش"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# دقیقه قبل}one{# دقیقه قبل}other{# دقیقه قبل}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ساعت قبل}one{# ساعت قبل}other{# ساعت قبل}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# روز قبل}one{# روز قبل}other{# روز قبل}}"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 2f57750c47ec..96609c99cd48 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> h:n päästä"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> pv:n päästä"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> v:n päästä"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min sitten"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> h sitten"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> pv sitten"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> v sitten"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> pv"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> v"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> min päästä"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> h:n päästä"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> pv:n päästä"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> v:n päästä"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min sitten"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> h sitten"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> pv sitten"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> v sitten"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuutti sitten}other{# minuuttia sitten}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# tunti sitten}other{# tuntia sitten}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# päivä sitten}other{# päivää sitten}}"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index a87fd677d37e..50a769626808 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"dans <xliff:g id="COUNT">%d</xliff:g> a"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"il y a <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"il y a <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"il y a <xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"il y a <xliff:g id="COUNT">%d</xliff:g> ans"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ans"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"dans <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"dans <xliff:g id="COUNT">%d</xliff:g> ans"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"il y a <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"il y a <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"il y a <xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"il y a <xliff:g id="COUNT">%d</xliff:g> ans"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index ba09a532be06..a72444d2bbd7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"dans <xliff:g id="COUNT">%d</xliff:g> an"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"il y a <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"il y a <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"il y a <xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"il y a <xliff:g id="COUNT">%d</xliff:g> an(s)"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> an(s)"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"dans <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"dans <xliff:g id="COUNT">%d</xliff:g> an(s)"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"il y a <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"il y a <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"il y a <xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"il y a <xliff:g id="COUNT">%d</xliff:g> an(s)"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index c46436f7e311..27454b9319ec 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g> a"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"hai <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"hai <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"hai <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"hai <xliff:g id="COUNT">%d</xliff:g> a."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> a."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"en <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"en <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"en <xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"hai <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"hai <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"hai <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"hai <xliff:g id="COUNT">%d</xliff:g> a."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hai # minuto}other{Hai # minutos}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hai # hora}other{Hai # horas}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hai # día}other{Hai # días}}"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 89f5a59ca916..4e4c9ffe1235 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> કલાકમાં"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> દિવસમાં"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> વર્ષમાં"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> મિનિટ પહેલાં"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> કલાક પહેલાં"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> દિવસ પહેલાં"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> વર્ષ પહેલાં"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> મિનિટ"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> કલાક"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> દિવસ"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> વર્ષ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> મિનિટમાં"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> કલાકમાં"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> દિવસમાં"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> વર્ષમાં"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> મિનિટ પહેલાં"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> કલાક પહેલાં"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> દિવસ પહેલાં"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> વર્ષ પહેલાં"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# મિનિટ પહેલાં}one{# મિનિટ પહેલાં}other{# મિનિટ પહેલાં}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# કલાક પહેલાં}one{# કલાક પહેલાં}other{# કલાક પહેલાં}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# દિવસ પહેલાં}one{# દિવસ પહેલાં}other{# દિવસ પહેલાં}}"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 4bdfa6baf14d..624d7a507c05 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> घंटे में"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> दिन में"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> साल में"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> मिनट पहले"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> घंटे पहले"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> दिन पहले"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> साल पहले"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> मिनट"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> घंटे"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> दिन"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> साल"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> मिनट में"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> घंटे में"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> दिन में"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> साल में"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> मिनट पहले"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> घंटे पहले"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> दिन पहले"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> साल पहले"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# मिनट पहले}one{# मिनट पहले}other{# मिनट पहले}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# घंटा पहले}one{# घंटा पहले}other{# घंटे पहले}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# दिन पहले}one{# दिन पहले}other{# दिन पहले}}"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index cd7d02343217..3429c140e70a 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> g."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"prije <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"prije <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"prije <xliff:g id="COUNT">%d</xliff:g> dana"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"prije <xliff:g id="COUNT">%d</xliff:g> god."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> god."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"za <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"za <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"za <xliff:g id="COUNT">%d</xliff:g> god."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"prije <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"prije <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"prije <xliff:g id="COUNT">%d</xliff:g> dana"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"prije <xliff:g id="COUNT">%d</xliff:g> god."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Prije # min}one{Prije # min}few{Prije # min}other{Prije # min}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Prije # h}one{Prije # h}few{Prije # h}other{Prije # h}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Prije # dan}one{Prije # dan}few{Prije # dana}other{Prije # dana}}"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index ddc8762931b9..2d46a3cb2929 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ó múlva"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> n múlva"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> é múlva"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> perce"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> órája"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> napja"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> éve"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> perc"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> óra"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> n"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> év"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> perc múlva"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> ó múlva"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> n múlva"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> év múlva"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> perce"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> órája"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> napja"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> éve"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# perce}other{# perce}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# órája}other{# órája}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# napja}other{# napja}}"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 3e961e74d17b..82d141f26af9 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ժամից"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> օրից"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> տարուց"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> ր առաջ"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ժ առաջ"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> օր առաջ"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> տ առաջ"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> րոպե"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ժ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> օր"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> տ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> րոպեից"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> ժամից"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> օրից"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> տարուց"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> ր առաջ"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ժ առաջ"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> օր առաջ"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> տ առաջ"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# րոպե առաջ}one{# րոպե առաջ}other{# րոպե առաջ}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ժամ առաջ}one{# ժամ առաջ}other{# ժամ առաջ}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# օր առաջ}one{# օր առաջ}other{# օր առաջ}}"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 594c173b907c..63bc9cf223af 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dalam <xliff:g id="COUNT">%d</xliff:g> j"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"dalam <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"dalam <xliff:g id="COUNT">%d</xliff:g> t"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> menit lalu"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> jam lalu"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> hr lalu"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> tahun lalu"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> mnt"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> jam"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> hari"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> tahun"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"dalam <xliff:g id="COUNT">%d</xliff:g> menit"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"dalam <xliff:g id="COUNT">%d</xliff:g> jam"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"dalam <xliff:g id="COUNT">%d</xliff:g> hari"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"dalam <xliff:g id="COUNT">%d</xliff:g> tahun"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> menit lalu"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> jam lalu"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> hr lalu"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> tahun lalu"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# menit lalu}other{# menit lalu}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# jam lalu}other{# jam lalu}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# hari lalu}other{# hari lalu}}"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 0242fa3e43d6..1b4309908629 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"eftir <xliff:g id="COUNT">%d</xliff:g> klst."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"eftir <xliff:g id="COUNT">%d</xliff:g> d."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"eftir <xliff:g id="COUNT">%d</xliff:g> ár"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"fyrir <xliff:g id="COUNT">%d</xliff:g> mín."</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"fyrir <xliff:g id="COUNT">%d</xliff:g> klst."</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"fyrir <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"fyrir <xliff:g id="COUNT">%d</xliff:g> á."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> mín."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> klst."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ár"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"eftir <xliff:g id="COUNT">%d</xliff:g> mín."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"eftir <xliff:g id="COUNT">%d</xliff:g> klst."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"eftir <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"eftir <xliff:g id="COUNT">%d</xliff:g> ár"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"fyrir <xliff:g id="COUNT">%d</xliff:g> mín."</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"fyrir <xliff:g id="COUNT">%d</xliff:g> klst."</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"fyrir <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"fyrir <xliff:g id="COUNT">%d</xliff:g> árum"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Fyrir # mínútu}one{Fyrir # mínútu}other{Fyrir # mínútum}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Fyrir # klukkustund}one{Fyrir # klukkustund}other{Fyrir # klukkustundum}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Fyrir # degi}one{Fyrir # degi}other{Fyrir # dögum}}"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index e912417fe4d7..9fd7913c934c 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"tra <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"tra <xliff:g id="COUNT">%d</xliff:g> g"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"tra <xliff:g id="COUNT">%d</xliff:g> a"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min fa"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> h fa"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> g fa"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> anni fa"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> g"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> anno"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"tra <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"tra <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"tra <xliff:g id="COUNT">%d</xliff:g> g"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"tra <xliff:g id="COUNT">%d</xliff:g> anno"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min fa"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> h fa"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> g fa"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> anni fa"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto fa}many{# di minuti fa}other{# minuti fa}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ora fa}many{# di ore fa}other{# ore fa}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# giorno fa}many{# di giorni fa}other{# giorni fa}}"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index a9ce2d284528..3a5c63c8b7e7 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"בעוד <xliff:g id="COUNT">%d</xliff:g> שע‘"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"בעוד <xliff:g id="COUNT">%d</xliff:g> י‘"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"בעוד <xliff:g id="COUNT">%d</xliff:g> שנים"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"לפני <xliff:g id="COUNT">%d</xliff:g>דק\'"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"לפני <xliff:g id="COUNT">%d</xliff:g>שע\'"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"לפני <xliff:g id="COUNT">%d</xliff:g>י\'"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"לפני <xliff:g id="COUNT">%d</xliff:g>שנ\'"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> דקות"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> שעות"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ימים"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> שנים"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"בעוד <xliff:g id="COUNT">%d</xliff:g> דקות"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"בעוד <xliff:g id="COUNT">%d</xliff:g> שעות"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"בעוד <xliff:g id="COUNT">%d</xliff:g> ימים"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"בעוד <xliff:g id="COUNT">%d</xliff:g> שנים"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"לפני <xliff:g id="COUNT">%d</xliff:g> דקות"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"לפני <xliff:g id="COUNT">%d</xliff:g> שעות"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"לפני <xliff:g id="COUNT">%d</xliff:g> ימים"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"לפני <xliff:g id="COUNT">%d</xliff:g> שנים"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{לפני דקה}one{לפני # דקות}two{לפני # דקות}other{לפני # דקות}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{לפני שעה}one{לפני # שעות}two{לפני שעתיים}other{לפני # שעות}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{לפני יום}one{לפני # ימים}two{לפני יומיים}other{לפני # ימים}}"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index b52896b69646..10cb0c3b87eb 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> საათში"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> დღეში"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> წელში"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> წთ.-ის წინ"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> სთ.-ის წინ"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> დღის წინ"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> წლის წინ"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> წთ."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> სთ."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> დღე"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> წელი"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> წთ.-ში"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> სთ.-ში"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> დღეში"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> წელში"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> წთ.-ის წინ"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> სთ.-ის წინ"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> დღის წინ"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> წლის წინ"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# წუთის წინ}other{# წუთის წინ}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# საათის წინ}other{# საათის წინ}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# დღის წინ}other{# დღის წინ}}"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 27299c5ee9f8..2db0fcd0999b 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g>ម៉"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g>ថ"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g>ឆ"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> នាទីមុន"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ម៉ោងមុន"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> ថ្ងៃមុន"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> ឆ្នាំមុន"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> ន"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ម៉"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ថ្ងៃ"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ឆ្នាំ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g> នាទី"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g> ម៉ោង"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g> ថ្ងៃ"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g> ឆ្នាំ"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> នាទីមុន"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ម៉ោងមុន"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> ថ្ងៃមុន"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> ឆ្នាំមុន"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# នាទីមុន}other{# នាទីមុន}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ម៉ោងមុន}other{# ម៉ោងមុន}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ថ្ងៃមុន}other{# ថ្ងៃមុន}}"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 5a4768367f4e..38e5bb573222 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>시간 후"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>일 후"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>년 후"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>분 전"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>시간 전"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>일 전"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>년 전"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>분"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>시간"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>일"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>년"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g>분 후"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g>시간 후"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g>일 후"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g>년 후"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>분 전"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>시간 전"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>일 전"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>년 전"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{#분 전}other{#분 전}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{#시간 전}other{#시간 전}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{#일 전}other{#일 전}}"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 2ca59918c408..60e2749d9f45 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> с. кийин"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> к. кийин"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ж. кийин"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> мүн. мурун"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> с. мурун"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> к. мурун"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> ж. мурун"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> мүн."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> с."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> к."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ж."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> мүн. кийин"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> с. кийин"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> к. кийин"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> ж. кийин"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> мүн. мурун"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> с. мурун"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> к. мурун"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> ж. мурун"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# мүнөт мурун}other{# мүнөт мурун}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# саат мурун}other{# саат мурун}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# күн мурун}other{# күн мурун}}"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 3b234e8be655..da2d1ad8ac86 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ໃນ <xliff:g id="COUNT">%d</xliff:g>ຊມ"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"ໃນ <xliff:g id="COUNT">%d</xliff:g>ມ"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"ໃນ <xliff:g id="COUNT">%d</xliff:g>ປ"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> ນາທີກ່ອນ"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງກ່ອນ"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> ມື້ກ່ອນ"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> ປີກ່ອນ"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> ນາທີ"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ມື້"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ປີ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ນາທີ"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງ"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ມື້"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ປີ"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> ນາທີກ່ອນ"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງກ່ອນ"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> ມື້ກ່ອນ"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> ປີກ່ອນ"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# ນາທີກ່ອນ}other{# ນາທີກ່ອນ}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ຊົ່ວໂມງກ່ອນ}other{# ຊົ່ວໂມງກ່ອນ}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ມື້ກ່ອນ}other{# ມື້ກ່ອນ}}"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index c1eaa041c06a..5de98814032f 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1160,38 +1160,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"po <xliff:g id="COUNT">%d</xliff:g> val."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"po <xliff:g id="COUNT">%d</xliff:g> d."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"po <xliff:g id="COUNT">%d</xliff:g> m."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"prieš <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"prieš <xliff:g id="COUNT">%d</xliff:g> val."</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"prieš <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"prieš <xliff:g id="COUNT">%d</xliff:g> m."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> val."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> m."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"po <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"po <xliff:g id="COUNT">%d</xliff:g> val."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"po <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"po <xliff:g id="COUNT">%d</xliff:g> m."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"prieš <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"prieš <xliff:g id="COUNT">%d</xliff:g> val."</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"prieš <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"prieš <xliff:g id="COUNT">%d</xliff:g> m."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Prieš # minutę}one{Prieš # minutę}few{Prieš # minutes}many{Prieš # minutės}other{Prieš # minučių}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Prieš # valandą}one{Prieš # valandą}few{Prieš # valandas}many{Prieš # valandos}other{Prieš # valandų}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Prieš # dieną}one{Prieš # dieną}few{Prieš # dienas}many{Prieš # dienos}other{Prieš # dienų}}"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 03c7c3c65cb7..ac109a87e88d 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"pēc <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"pēc <xliff:g id="COUNT">%d</xliff:g> d."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"pēc <xliff:g id="COUNT">%d</xliff:g> g."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"pirms <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"pirms <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"pirms <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"pirms <xliff:g id="COUNT">%d</xliff:g> g."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> g."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"pēc <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"pēc <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"pēc <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"pēc <xliff:g id="COUNT">%d</xliff:g> g."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"pirms <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"pirms <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"pirms <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"pirms <xliff:g id="COUNT">%d</xliff:g> g."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Pirms vienas minūtes}zero{Pirms # minūtēm}one{Pirms vairākām minūtēm, minūšu skaits: #}other{Pirms vairākām minūtēm, minūšu skaits: #}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Pirms vienas stundas}zero{Pirms # stundām}one{Pirms vairākām stundām, stundu skaits: #}other{Pirms vairākām stundām, stundu skaits: #}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Pirms vienas dienas}zero{Pirms # dienām}one{Pirms vairākām dienām, dienu skaits: #}other{Pirms vairākām dienām, dienu skaits: #}}"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index e299c8b5a7a8..1f30da3e7305 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"по <xliff:g id="COUNT">%d</xliff:g> ч."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"по <xliff:g id="COUNT">%d</xliff:g> д."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"по <xliff:g id="COUNT">%d</xliff:g> г."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"пред <xliff:g id="COUNT">%d</xliff:g> мин."</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"пред <xliff:g id="COUNT">%d</xliff:g> ч."</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"пред <xliff:g id="COUNT">%d</xliff:g> д."</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"пред <xliff:g id="COUNT">%d</xliff:g> год."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> мин."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ч."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> д."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> год."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"по <xliff:g id="COUNT">%d</xliff:g> мин."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"по <xliff:g id="COUNT">%d</xliff:g> ч."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"по <xliff:g id="COUNT">%d</xliff:g> д."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"по <xliff:g id="COUNT">%d</xliff:g> год."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"пред <xliff:g id="COUNT">%d</xliff:g> мин."</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"пред <xliff:g id="COUNT">%d</xliff:g> ч."</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"пред <xliff:g id="COUNT">%d</xliff:g> д."</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"пред <xliff:g id="COUNT">%d</xliff:g> год."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Пред # минута}one{Пред # минута}other{Пред # минути}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Пред # час}one{Пред # час}other{Пред # часа}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Пред # ден}one{Пред # ден}other{Пред # дена}}"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 3c08c013d3e3..7f8027dff916 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>മണിക്കൂറിൽ"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>ദിവസത്തിൽ"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>വർഷത്തിനുള്ളിൽ"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>m മുമ്പ്"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>h മുമ്പ്"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>ദിവസം മുമ്പ്"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>വർഷം മുമ്പ്"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>മിനിറ്റ്"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>മണിക്കൂർ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>ദിവസം"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>വർഷം"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g>മിനിറ്റിൽ"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g>മണിക്കൂറിൽ"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g>ദിവസത്തിനുള്ളിൽ"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g>വർഷത്തിൽ"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>മിനിറ്റ് മുമ്പ്"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>മണിക്കൂർ മുമ്പ്"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>ദിവസം മുമ്പ്"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>വർഷം മുമ്പ്"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# മിനിറ്റ് മുമ്പ്}other{# മിനിറ്റ് മുമ്പ്}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# മണിക്കൂർ മുമ്പ്}other{# മണിക്കൂർ മുമ്പ്}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ദിവസം മുമ്പ്}other{# ദിവസം മുമ്പ്}}"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index e32eff0f91a1..8043baec1b4e 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>цагийн дараа"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>хоногийн дараа"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>жилийн дараа"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> минутын өмнө"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> цагийн өмнө"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> хоногийн өмнө"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> жилийн өмнө"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> минут"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> цаг"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> хоног"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> жил"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> минутын дараа"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> цагийн дараа"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> хоногийн дараа"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> жилийн дараа"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> минутын өмнө"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> цагийн өмнө"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> хоногийн өмнө"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> жилийн өмнө"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# минутын өмнө}other{# минутын өмнө}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# цагийн өмнө}other{# цагийн өмнө}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# хоногийн өмнө}other{# хоногийн өмнө}}"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index abe9a948a063..7bdd94254966 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> तासांमध्ये"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> दिवसांमध्ये"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> वर्षांमध्ये"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>मिनिटापूर्वी"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>तासापूर्वी"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>दिवसापूर्वी"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>वर्षापूर्वी"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>मिनिट"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>तास"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>दिवस"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>वर्ष"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g>मिनिटामध्ये"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g>तासामध्ये"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g>दिवसामध्ये"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g>वर्षामध्ये"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>मिनिटापूर्वी"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>तासापूर्वी"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>दिवसापूर्वी"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>वर्षापूर्वी"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# मिनिटापूर्वी}other{# मिनिटांपूर्वी}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# तासापूर्वी}other{# तासांपूर्वी}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# दिवसापूर्वी}other{# दिवसांपूर्वी}}"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index ec6eff427a19..61af771b5818 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> နာရီအတွင်း"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ရက်အတွင်း"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> နှစ်အတွင်း"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> မိနစ်"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> နာရီ"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> ရက်"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> နှစ်"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> မိနစ်"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> နာရီ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ရက်"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> နှစ်"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> မိနစ်အတွင်း"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> နာရီအတွင်း"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> ရက်အတွင်း"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> နှစ်အတွင်း"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> မိနစ်"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> နာရီ"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> ရက်"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"ပြီးခဲ့သော <xliff:g id="COUNT">%d</xliff:g> နှစ်"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{ပြီးခဲ့သော # မိနစ်}other{ပြီးခဲ့သော # မိနစ်}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{ပြီးခဲ့သော # နာရီ}other{ပြီးခဲ့သော # နာရီ}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{ပြီးခဲ့သော # ရက်}other{ပြီးခဲ့သော # ရက်}}"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index fd80ab4653b8..0ddbc41a8cec 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"om <xliff:g id="COUNT">%d</xliff:g> t"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"om <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"om <xliff:g id="COUNT">%d</xliff:g> år"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"for <xliff:g id="COUNT">%d</xliff:g>m siden"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"for <xliff:g id="COUNT">%d</xliff:g>t siden"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"for <xliff:g id="COUNT">%d</xliff:g>d siden"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"for <xliff:g id="COUNT">%d</xliff:g> år siden"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>t"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> år"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"om <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"om <xliff:g id="COUNT">%d</xliff:g>t"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"om <xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"om <xliff:g id="COUNT">%d</xliff:g> år"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"for <xliff:g id="COUNT">%d</xliff:g> min siden"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"for <xliff:g id="COUNT">%d</xliff:g>t siden"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"for <xliff:g id="COUNT">%d</xliff:g>d siden"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"for <xliff:g id="COUNT">%d</xliff:g> år siden"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{for # minutt siden}other{For # minutter siden}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# time siden}other{# timer siden}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{For # dag siden}other{For # dager siden}}"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 6fabb068759e..c9a922eae470 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> घण्टाभित्र"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> दिनभित्र"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> वर्षभित्र"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> मिनेटअघि"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> घण्टाअघि"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> दिनअघि"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> वर्षअघि"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> मिनेट"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> घण्टा"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> दिन"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> वर्ष"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> मिनेटपछि"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> घण्टापछि"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> दिनपछि"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> वर्षपछि"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> मिनेटअघि"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> घण्टाअघि"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> दिनअघि"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> वर्षअघि"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# मिनेटअघि}other{# मिनेटअघि}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# घण्टाअघि}other{# घण्टाअघि}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# दिनअघि}other{# दिनअघि}}"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index b93b916997be..e88384b48c7f 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"over <xliff:g id="COUNT">%d</xliff:g> u"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"over <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"over <xliff:g id="COUNT">%d</xliff:g> j"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min geleden"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> u geleden"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> d geleden"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> j geleden"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> u"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"over <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"over <xliff:g id="COUNT">%d</xliff:g> u"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"over <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"over <xliff:g id="COUNT">%d</xliff:g> j"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min geleden"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> u geleden"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> d geleden"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> j geleden"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuut geleden}other{# minuten geleden}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# uur geleden}other{# uur geleden}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dag geleden}other{# dagen geleden}}"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 961822a86bd7..9960691d7206 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ଘଣ୍ଟାରେ"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ଦିନରେ"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ବର୍ଷରେ"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> ମିନିଟ ପୂର୍ବେ"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ଘଣ୍ଟା ପୂର୍ବେ"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> ଦିନ ପୂର୍ବେ"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> ବର୍ଷ ପୂର୍ବେ"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> ମିନିଟ"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ଘଣ୍ଟା"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ଦିନ"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ବର୍ଷ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> ମିନିଟରେ"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> ଘଣ୍ଟାରେ"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> ଦିନରେ"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> ବର୍ଷରେ"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> ମିନିଟ ପୂର୍ବେ"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ଘଣ୍ଟା ପୂର୍ବେ"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> ଦିନ ପୂର୍ବେ"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> ବର୍ଷ ପୂର୍ବେ"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# ମିନିଟ ପୂର୍ବେ}other{# ମିନିଟ ପୂର୍ବେ}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ଘଣ୍ଟା ପୂର୍ବେ}other{# ଘଣ୍ଟା ପୂର୍ବେ}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ଦିନ ପୂର୍ବେ}other{# ଦିନ ପୂର୍ବେ}}"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 238354adbb66..6d92e0148d78 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ ਵਿੱਚ"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ਦਿਨ ਵਿੱਚ"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ਸਾਲ ਵਿੱਚ"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ ਪਹਿਲਾਂ"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ ਪਹਿਲਾਂ"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> ਦਿਨ ਪਹਿਲਾਂ"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> ਸਾਲ ਪਹਿਲਾਂ"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ਘੰਟਾ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ਦਿਨ"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ਸਾਲ"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ ਵਿੱਚ"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ ਵਿੱਚ"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> ਦਿਨ ਵਿੱਚ"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> ਸਾਲ ਵਿੱਚ"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ ਪਹਿਲਾਂ"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ਘੰਟਾ ਪਹਿਲਾਂ"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> ਦਿਨ ਪਹਿਲਾਂ"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> ਸਾਲ ਪਹਿਲਾਂ"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# ਮਿੰਟ ਪਹਿਲਾਂ}one{# ਮਿੰਟ ਪਹਿਲਾਂ}other{# ਮਿੰਟ ਪਹਿਲਾਂ}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ਘੰਟਾ ਪਹਿਲਾਂ}one{# ਘੰਟਾ ਪਹਿਲਾਂ}other{# ਘੰਟੇ ਪਹਿਲਾਂ}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ਦਿਨ ਪਹਿਲਾਂ}one{# ਦਿਨ ਪਹਿਲਾਂ}other{# ਦਿਨ ਪਹਿਲਾਂ}}"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 3d71d7baeaca..ec37251a7394 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1160,38 +1160,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> godz."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> r."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min temu"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> godz. temu"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> d temu"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> r./l. temu"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> godz."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> r./l."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"za <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"za <xliff:g id="COUNT">%d</xliff:g> godz."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"za <xliff:g id="COUNT">%d</xliff:g> d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"za <xliff:g id="COUNT">%d</xliff:g> r./l."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min temu"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> godz. temu"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> d temu"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> r./l. temu"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minutę temu}few{# minuty temu}many{# minut temu}other{# minuty temu}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# godzinę temu}few{# godziny temu}many{# godzin temu}other{# godziny temu}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dzień temu}few{# dni temu}many{# dni temu}other{# dnia temu}}"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 79bfcf49c1c5..738951eac18b 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"în <xliff:g id="COUNT">%d</xliff:g> ore"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"în <xliff:g id="COUNT">%d</xliff:g> z"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"în <xliff:g id="COUNT">%d</xliff:g> ani"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"acum <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"acum <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"acum <xliff:g id="COUNT">%d</xliff:g> z"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"acum <xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> z"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"peste <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"peste <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"peste <xliff:g id="COUNT">%d</xliff:g> z"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"peste <xliff:g id="COUNT">%d</xliff:g> a"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"acum <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"acum <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"acum <xliff:g id="COUNT">%d</xliff:g> z"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"acum <xliff:g id="COUNT">%d</xliff:g> a"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Acum # minut}few{Acum # minute}other{Acum # de minute}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Acum # oră}few{Acum # ore}other{Acum # de ore}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Acum # zi}few{Acum # zile}other{Acum # de zile}}"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 2631dabe06fb..285e941070ba 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1160,38 +1160,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"через <xliff:g id="COUNT">%d</xliff:g> ч."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"через <xliff:g id="COUNT">%d</xliff:g> дн."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"через <xliff:g id="COUNT">%d</xliff:g> г."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> мин. назад"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ч. назад"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> дн. назад"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> г./лет назад"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> мин."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ч."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> дн."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> г./лет"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"через <xliff:g id="COUNT">%d</xliff:g> мин."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"через <xliff:g id="COUNT">%d</xliff:g> ч."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"через <xliff:g id="COUNT">%d</xliff:g> дн."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"через <xliff:g id="COUNT">%d</xliff:g> г./лет"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> мин. назад"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ч. назад"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> дн. назад"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> г./лет назад"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# минуту назад}one{# минуту назад}few{# минуты назад}many{# минут назад}other{# минуты назад}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# час назад}one{# час назад}few{# часа назад}many{# часов назад}other{# часа назад}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# день назад}one{# день назад}few{# дня назад}many{# дней назад}other{# дня назад}}"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 99b925aa19ba..0cb6f3096167 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"පැ<xliff:g id="COUNT">%d</xliff:g>කින්"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"දි<xliff:g id="COUNT">%d</xliff:g>කින්"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"ව<xliff:g id="COUNT">%d</xliff:g>කින්"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"මිනි <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"පැය <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"දින <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"වසර <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"මිනි <xliff:g id="COUNT">%d</xliff:g>ක්"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"පැය <xliff:g id="COUNT">%d</xliff:g>ක්"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"දින <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_years_medium" msgid="734023884353592526">"වසර <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"මිනි <xliff:g id="COUNT">%d</xliff:g>කින්"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"පැය <xliff:g id="COUNT">%d</xliff:g>කින්"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"දින <xliff:g id="COUNT">%d</xliff:g>කින්"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"වසර <xliff:g id="COUNT">%d</xliff:g>කින්"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"මිනි <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"පැය <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"දින <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"වසර <xliff:g id="COUNT">%d</xliff:g>කට පෙර"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{මිනිත්තු #කට පෙර}one{මිනිත්තු #කට පෙර}other{මිනිත්තු #කට පෙර}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{පැය #කට පෙර}one{පැය #කට පෙර}other{පැය #කට පෙර}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{දින #කට පෙර}one{දින #කට පෙර}other{දින #කට පෙර}}"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 3277781640f6..9d0efef85a72 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1160,38 +1160,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"o <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"o <xliff:g id="COUNT">%d</xliff:g> d."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"o <xliff:g id="COUNT">%d</xliff:g> r."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"Pred <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"Pred <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"Pred <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"Pred <xliff:g id="COUNT">%d</xliff:g> r."</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> r."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"O <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"O <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"O <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"O <xliff:g id="COUNT">%d</xliff:g> r."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"Pred <xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"Pred <xliff:g id="COUNT">%d</xliff:g> h"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"Pred <xliff:g id="COUNT">%d</xliff:g> d."</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"Pred <xliff:g id="COUNT">%d</xliff:g> r."</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Pred # minútou}few{Pred # minútami}many{Pred # minúty}other{Pred # minútami}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Pred # hodinou}few{Pred # hodinami}many{Pred # hodiny}other{Pred # hodinami}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Pred # dňom}few{Pred # dňami}many{Pred # dňa}other{Pred # dňami}}"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 44981bb37708..744b5577904f 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"për <xliff:g id="COUNT">%d</xliff:g> orë"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"për <xliff:g id="COUNT">%d</xliff:g> ditë"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"për <xliff:g id="COUNT">%d</xliff:g> vit"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> min. më parë"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> orë më parë"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> ditë më parë"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> vite më parë"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> orë"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ditë"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> vite"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"për <xliff:g id="COUNT">%d</xliff:g> min."</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"për <xliff:g id="COUNT">%d</xliff:g> orë"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"për <xliff:g id="COUNT">%d</xliff:g> ditë"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"për <xliff:g id="COUNT">%d</xliff:g> vite"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> min. më parë"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> orë më parë"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> ditë më parë"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> vite më parë"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minutë më parë}other{# minuta më parë}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# orë më parë}other{# orë më parë}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ditë më parë}other{# ditë më parë}}"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index cc2248c02229..45fb8ee60e1e 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1159,38 +1159,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"за <xliff:g id="COUNT">%d</xliff:g> с"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"за <xliff:g id="COUNT">%d</xliff:g> д"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"за <xliff:g id="COUNT">%d</xliff:g> год"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"пре <xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"пре <xliff:g id="COUNT">%d</xliff:g> с"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"пре <xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"пре <xliff:g id="COUNT">%d</xliff:g> г"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> с"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> год"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"за <xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"за <xliff:g id="COUNT">%d</xliff:g> с"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"за <xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"за <xliff:g id="COUNT">%d</xliff:g> год"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"пре <xliff:g id="COUNT">%d</xliff:g> мин"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"пре <xliff:g id="COUNT">%d</xliff:g> с"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"пре <xliff:g id="COUNT">%d</xliff:g> д"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"пре <xliff:g id="COUNT">%d</xliff:g> год"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Пре # минут}one{Пре # минут}few{Пре # минута}other{Пре # минута}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Пре # сат}one{Пре # сат}few{Пре # сата}other{Пре # сати}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Пре # дан}one{Пре # дан}few{Пре # дана}other{Пре # дана}}"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index a7d4d863187d..d6565bfe33aa 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"baada ya saa <xliff:g id="COUNT">%d</xliff:g>"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"baada ya siku <xliff:g id="COUNT">%d</xliff:g>"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"baada ya mwaka <xliff:g id="COUNT">%d</xliff:g>"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"dak <xliff:g id="COUNT">%d</xliff:g> zilizopita"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"saa <xliff:g id="COUNT">%d</xliff:g> zilizopita"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"siku <xliff:g id="COUNT">%d</xliff:g> zilizopita"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"miaka <xliff:g id="COUNT">%d</xliff:g> iliyopita"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"dak <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"saa <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"siku <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_years_medium" msgid="734023884353592526">"miaka <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"ndani ya dak <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"ndani ya saa <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"ndani ya siku <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"ndani ya miaka <xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"dak <xliff:g id="COUNT">%d</xliff:g> zilizopita"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"saa <xliff:g id="COUNT">%d</xliff:g> zilizopita"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"siku <xliff:g id="COUNT">%d</xliff:g> zilizopita"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"miaka <xliff:g id="COUNT">%d</xliff:g> iliyopita"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Dakika # iliyopita}other{Dakika # zilizopita}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Saa # iliyopita}other{Saa # zilizopita}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Siku # iliyopita}other{Siku # zilizopita}}"</string> diff --git a/core/res/res/values-sw600dp/config.xml b/core/res/res/values-sw600dp/config.xml index 34b6a54be493..0b0a4cb5cd17 100644 --- a/core/res/res/values-sw600dp/config.xml +++ b/core/res/res/values-sw600dp/config.xml @@ -47,7 +47,7 @@ <bool name="config_navBarCanMove">false</bool> <!-- Set to true to enable the user switcher on the keyguard. --> - <bool name="config_keyguardUserSwitcher">true</bool> + <bool name="config_keyguardUserSwitcher">false</bool> <!-- If true, show multiuser switcher by default unless the user specifically disables it. --> <bool name="config_showUserSwitcherByDefault">true</bool> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 6107dbee9b26..17119a6b974e 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> மணிநேரத்தில்"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> நாட்களில்"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ஆண்டில்"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> நி முன்பு"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ம.நே முன்பு"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> நா முன்பு"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> ஆண்டு முன்பு"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> நிமிடம்"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ம.நே"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> நா"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ஆண்டு"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> நிமிடத்தில்"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> மணிநேரத்தில்"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> நாளில்"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> ஆண்டில்"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> நிமிடம் முன்பு"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ம.நே முன்பு"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> நா முன்பு"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> ஆண்டுக்கு முன்பு"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# நிமிடத்திற்கு முன்பு}other{# நிமிடங்களுக்கு முன்பு}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# மணிநேரத்திற்கு முன்பு}other{# மணிநேரத்திற்கு முன்பு}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# நாளுக்கு முன்பு}other{# நாட்களுக்கு முன்பு}}"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 53ef42a784af..c2be30e11c11 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>గంటలో"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>రోజులో"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>సంవత్సరంలో"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>నిమిషం క్రితం"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>గంట క్రితం"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>రోజు క్రితం"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>సం క్రితం"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g>నిమిషం"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>గంట"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>రోజు"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>సంవత్సరం"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g>నిమిషాలలో"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g>గంటలో"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g>రోజులో"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g>సంవత్సరంలో"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>నిమిషాల క్రితం"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>గంట క్రితం"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>రోజు క్రితం"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>సంవత్సరం క్రితం"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# నిమిషం క్రితం}other{# నిమిషాల క్రితం}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# గంట క్రితం}other{# గంటల క్రితం}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# రోజు క్రితం}other{# రోజుల క్రితం}}"</string> @@ -2130,7 +2114,7 @@ <string name="autofill_save_no" msgid="9212826374207023544">"వద్దు, ధన్యవాదాలు"</string> <string name="autofill_save_notnow" msgid="2853932672029024195">"ఇప్పుడు కాదు"</string> <string name="autofill_save_never" msgid="6821841919831402526">"ఎప్పుడూ వద్దు"</string> - <string name="autofill_update_yes" msgid="4608662968996874445">"అప్డేట్ చేయి"</string> + <string name="autofill_update_yes" msgid="4608662968996874445">"అప్డేట్ చేయండి"</string> <string name="autofill_continue_yes" msgid="7914985605534510385">"కొనసాగించండి"</string> <string name="autofill_save_type_password" msgid="5624528786144539944">"పాస్వర్డ్"</string> <string name="autofill_save_type_address" msgid="3111006395818252885">"అడ్రస్"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 43b142357998..7e70a3b573d8 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ใน <xliff:g id="COUNT">%d</xliff:g> ชม."</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"ใน <xliff:g id="COUNT">%d</xliff:g> วัน"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"ใน <xliff:g id="COUNT">%d</xliff:g> ปี"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> นาทีที่ผ่านมา"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> ชม. ที่ผ่านมา"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> วันที่ผ่านมา"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> ปีที่ผ่านมา"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> นาที"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> ชม."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> วัน"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> ปี"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"ใน <xliff:g id="COUNT">%d</xliff:g> นาที"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"ใน <xliff:g id="COUNT">%d</xliff:g> ชม."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"ใน <xliff:g id="COUNT">%d</xliff:g> วัน"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"ใน <xliff:g id="COUNT">%d</xliff:g> ปี"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> นาทีที่ผ่านมา"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> ชม. ที่ผ่านมา"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> วันที่ผ่านมา"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> ปีที่ผ่านมา"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# นาทีที่ผ่านมา}other{# นาทีที่ผ่านมา}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ชั่วโมงที่ผ่านมา}other{# ชั่วโมงที่ผ่านมา}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# วันที่ผ่านมา}other{# วันที่ผ่านมา}}"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 1dbd00bed90a..6fd93bc5823c 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"sa <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"sa <xliff:g id="COUNT">%d</xliff:g>d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"sa <xliff:g id="COUNT">%d</xliff:g>y"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g>m nakalipas"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g>h nakalipas"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g>d nakalipas"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g>y nakalipas"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> min"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"sa <xliff:g id="COUNT">%d</xliff:g> (na) min"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"sa loob ng <xliff:g id="COUNT">%d</xliff:g>hr"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"sa <xliff:g id="COUNT">%d</xliff:g>d"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"sa <xliff:g id="COUNT">%d</xliff:g>yr"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g>min ang nakalipas"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g>hr ang nakalipas"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g>d ang nakalipas"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g>yr ang nakalipas"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto ang nakalipas}one{# minuto ang nakalipas}other{# na minuto ang nakalipas}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# oras ang nakalipas}one{# oras ang nakalipas}other{# na oras ang nakalipas}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# araw ang nakalipas}one{# araw ang nakalipas}other{# na araw ang nakalipas}}"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 3777f04ca136..16915b5b43f7 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> saat içinde"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> gün içinde"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> yıl içinde"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> dk. önce"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> sa. önce"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> gün önce"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> yıl önce"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> dk."</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> sa."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> gün"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> yıl"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> dk. içinde"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> sa. içinde"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> gün içinde"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> yıl içinde"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> dk. önce"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> sa. önce"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> gün önce"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> yıl önce"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# dakika önce}other{# dakika önce}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# saat önce}other{# saat önce}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# gün önce}other{# gün önce}}"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 3d603e34c395..dcf15a0ff01c 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1160,38 +1160,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"через <xliff:g id="COUNT">%d</xliff:g> год"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"через <xliff:g id="COUNT">%d</xliff:g> дн."</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"через <xliff:g id="COUNT">%d</xliff:g> р."</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> хв тому"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> год тому"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> дн. тому"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> р. тому"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> хв"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> год"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> дн."</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> р."</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"через <xliff:g id="COUNT">%d</xliff:g> хв"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"через <xliff:g id="COUNT">%d</xliff:g> год"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"через <xliff:g id="COUNT">%d</xliff:g> дн."</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"через <xliff:g id="COUNT">%d</xliff:g> р."</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> хв тому"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> год тому"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> дн. тому"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> р. тому"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# хвилину тому}one{# хвилину тому}few{# хвилини тому}many{# хвилин тому}other{# хвилини тому}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# годину тому}one{# годину тому}few{# години тому}many{# годин тому}other{# години тому}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# день тому}one{# день тому}few{# дні тому}many{# днів тому}other{# дня тому}}"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 8a9c661658a3..8c75e818fb97 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> گھنٹے میں"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> دن میں"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> سال میں"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> منٹ قبل"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> گھنٹہ قبل"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> دن قبل"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> سال قبل"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> منٹ"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> گھنٹہ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> دن"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> سال"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> منٹ میں"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> گھنٹے میں"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> دن میں"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> سال میں"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> منٹ قبل"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> گھنٹہ قبل"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> دن قبل"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> سال قبل"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# منٹ پہلے}other{# منٹ پہلے}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# گھنٹہ پہلے}other{# گھنٹے پہلے}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# دن پہلے}other{# دن پہلے}}"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index f42e46ffb6cc..ad0f42d2b868 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> giờ nữa"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ngày nữa"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> năm nữa"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> phút trước"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> giờ trước"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> ngày trước"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> năm trước"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> phút"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> giờ"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> ngày"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> năm"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> phút nữa"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> giờ nữa"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> ngày nữa"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> năm nữa"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> phút trước"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> giờ trước"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> ngày trước"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> năm trước"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# phút trước}other{# phút trước}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# giờ trước}other{# giờ trước}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ngày trước}other{# ngày trước}}"</string> diff --git a/core/res/res/values-w192dp/dimens_material.xml b/core/res/res/values-w192dp/dimens_material.xml index 797bf5a4c717..a11eb7f96f45 100644 --- a/core/res/res/values-w192dp/dimens_material.xml +++ b/core/res/res/values-w192dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">7.99dp</dimen> <dimen name="screen_percentage_05">9.6dp</dimen> + <dimen name="screen_percentage_052">9.98dp</dimen> <dimen name="screen_percentage_10">19.2dp</dimen> + <dimen name="screen_percentage_12">23.04dp</dimen> <dimen name="screen_percentage_15">28.8dp</dimen> + <dimen name="screen_percentage_3646">69.99dp</dimen> </resources> diff --git a/core/res/res/values-w195dp/dimens_material.xml b/core/res/res/values-w195dp/dimens_material.xml index 7f3ad29f5505..346066f27349 100644 --- a/core/res/res/values-w195dp/dimens_material.xml +++ b/core/res/res/values-w195dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.11dp</dimen> <dimen name="screen_percentage_05">9.75dp</dimen> + <dimen name="screen_percentage_052">10.14dp</dimen> <dimen name="screen_percentage_10">19.5dp</dimen> + <dimen name="screen_percentage_12">23.4dp</dimen> <dimen name="screen_percentage_15">29.25dp</dimen> + <dimen name="screen_percentage_3646">71.09dp</dimen> </resources> diff --git a/core/res/res/values-w198dp/dimens_material.xml b/core/res/res/values-w198dp/dimens_material.xml index a8aed2541c57..4c88f0520a71 100644 --- a/core/res/res/values-w198dp/dimens_material.xml +++ b/core/res/res/values-w198dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.24dp</dimen> <dimen name="screen_percentage_05">9.9dp</dimen> + <dimen name="screen_percentage_052">10.3dp</dimen> <dimen name="screen_percentage_10">19.8dp</dimen> + <dimen name="screen_percentage_12">23.76dp</dimen> <dimen name="screen_percentage_15">29.7dp</dimen> + <dimen name="screen_percentage_3646">72.1dp</dimen> </resources> diff --git a/core/res/res/values-w204dp-round-watch/dimens_material.xml b/core/res/res/values-w204dp-round-watch/dimens_material.xml index c07d5c47e2e1..54bb0c9c292e 100644 --- a/core/res/res/values-w204dp-round-watch/dimens_material.xml +++ b/core/res/res/values-w204dp-round-watch/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.48dp</dimen> <dimen name="screen_percentage_05">10.2dp</dimen> + <dimen name="screen_percentage_052">10.61dp</dimen> <dimen name="screen_percentage_10">20.4dp</dimen> + <dimen name="screen_percentage_12">24.48dp</dimen> <dimen name="screen_percentage_15">30.6dp</dimen> + <dimen name="screen_percentage_3646">74.42dp</dimen> </resources> diff --git a/core/res/res/values-w205dp/dimens_material.xml b/core/res/res/values-w205dp/dimens_material.xml index 94907ee51dcc..60f65bb5863a 100644 --- a/core/res/res/values-w205dp/dimens_material.xml +++ b/core/res/res/values-w205dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.52dp</dimen> <dimen name="screen_percentage_05">10.25dp</dimen> + <dimen name="screen_percentage_052">10.66dp</dimen> <dimen name="screen_percentage_10">20.5dp</dimen> + <dimen name="screen_percentage_12">24.6dp</dimen> <dimen name="screen_percentage_15">30.75dp</dimen> + <dimen name="screen_percentage_3646">74.78dp</dimen> </resources> diff --git a/core/res/res/values-w208dp/dimens_material.xml b/core/res/res/values-w208dp/dimens_material.xml index 069eeb0ad753..7f4ccd9d15cb 100644 --- a/core/res/res/values-w208dp/dimens_material.xml +++ b/core/res/res/values-w208dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.65dp</dimen> <dimen name="screen_percentage_05">10.4dp</dimen> + <dimen name="screen_percentage_052">10.82dp</dimen> <dimen name="screen_percentage_10">20.8dp</dimen> + <dimen name="screen_percentage_12">24.96dp</dimen> <dimen name="screen_percentage_15">31.2dp</dimen> + <dimen name="screen_percentage_3646">75.65dp</dimen> </resources> diff --git a/core/res/res/values-w210dp-round-watch/dimens_material.xml b/core/res/res/values-w210dp-round-watch/dimens_material.xml index 79acf84b7e3f..ca0889e2c73b 100644 --- a/core/res/res/values-w210dp-round-watch/dimens_material.xml +++ b/core/res/res/values-w210dp-round-watch/dimens_material.xml @@ -14,6 +14,14 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.73dp</dimen> + <dimen name="screen_percentage_05">10.5dp</dimen> + <dimen name="screen_percentage_052">10.92dp</dimen> + <dimen name="screen_percentage_10">21dp</dimen> + <dimen name="screen_percentage_12">25.2dp</dimen> + <dimen name="screen_percentage_15">31.5dp</dimen> + <dimen name="screen_percentage_3646">76.57dp</dimen> + <dimen name="text_size_display_4_material">80sp</dimen> <dimen name="text_size_display_3_material">50sp</dimen> <dimen name="text_size_display_2_material">40sp</dimen> diff --git a/core/res/res/values-w211dp/dimens_material.xml b/core/res/res/values-w211dp/dimens_material.xml index bd7ca9aa9164..c483e455c5c3 100644 --- a/core/res/res/values-w211dp/dimens_material.xml +++ b/core/res/res/values-w211dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.77dp</dimen> <dimen name="screen_percentage_05">10.55dp</dimen> + <dimen name="screen_percentage_052">10.97dp</dimen> <dimen name="screen_percentage_10">21.1dp</dimen> + <dimen name="screen_percentage_12">25.32dp</dimen> <dimen name="screen_percentage_15">31.65dp</dimen> + <dimen name="screen_percentage_3646">76.93dp</dimen> </resources> diff --git a/core/res/res/values-w213dp/dimens_material.xml b/core/res/res/values-w213dp/dimens_material.xml index 8a4e3a08ea13..093c298e1ac9 100644 --- a/core/res/res/values-w213dp/dimens_material.xml +++ b/core/res/res/values-w213dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">8.85dp</dimen> <dimen name="screen_percentage_05">10.65dp</dimen> + <dimen name="screen_percentage_052">11.07dp</dimen> <dimen name="screen_percentage_10">21.3dp</dimen> + <dimen name="screen_percentage_12">25.56dp</dimen> <dimen name="screen_percentage_15">31.95dp</dimen> + <dimen name="screen_percentage_3646">77.66dp</dimen> </resources> diff --git a/core/res/res/values-w216dp/dimens_material.xml b/core/res/res/values-w216dp/dimens_material.xml new file mode 100644 index 000000000000..71dbf727480e --- /dev/null +++ b/core/res/res/values-w216dp/dimens_material.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <dimen name="screen_percentage_0416">8.99dp</dimen> + <dimen name="screen_percentage_05">10.8dp</dimen> + <dimen name="screen_percentage_052">11.23dp</dimen> + <dimen name="screen_percentage_10">21.6dp</dimen> + <dimen name="screen_percentage_12">25.92dp</dimen> + <dimen name="screen_percentage_15">32.4dp</dimen> + <dimen name="screen_percentage_3646">78.77dp</dimen> +</resources> diff --git a/core/res/res/values-w225dp/dimens_material.xml b/core/res/res/values-w225dp/dimens_material.xml index aa822a32c975..6df34a5bb0ea 100644 --- a/core/res/res/values-w225dp/dimens_material.xml +++ b/core/res/res/values-w225dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">9.36dp</dimen> <dimen name="screen_percentage_05">11.25dp</dimen> + <dimen name="screen_percentage_052">11.7dp</dimen> <dimen name="screen_percentage_10">22.5dp</dimen> + <dimen name="screen_percentage_12">27dp</dimen> <dimen name="screen_percentage_15">33.75dp</dimen> + <dimen name="screen_percentage_3646">82.46dp</dimen> </resources> diff --git a/core/res/res/values-w227dp/dimens_material.xml b/core/res/res/values-w227dp/dimens_material.xml index eb4df8a225d6..bbf4924ccc23 100644 --- a/core/res/res/values-w227dp/dimens_material.xml +++ b/core/res/res/values-w227dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">9.44dp</dimen> <dimen name="screen_percentage_05">11.35dp</dimen> + <dimen name="screen_percentage_052">11.8dp</dimen> <dimen name="screen_percentage_10">22.7dp</dimen> + <dimen name="screen_percentage_12">27.24dp</dimen> <dimen name="screen_percentage_15">34.05dp</dimen> + <dimen name="screen_percentage_3646">83.19dp</dimen> </resources> diff --git a/core/res/res/values-w228dp/dimens_material.xml b/core/res/res/values-w228dp/dimens_material.xml index a2009754d95b..24bbb4c219ba 100644 --- a/core/res/res/values-w228dp/dimens_material.xml +++ b/core/res/res/values-w228dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">9.48dp</dimen> <dimen name="screen_percentage_05">11.4dp</dimen> + <dimen name="screen_percentage_052">11.86dp</dimen> <dimen name="screen_percentage_10">22.8dp</dimen> + <dimen name="screen_percentage_12">27.36dp</dimen> <dimen name="screen_percentage_15">34.2dp</dimen> + <dimen name="screen_percentage_3646">83.55dp</dimen> </resources> diff --git a/core/res/res/values-w240dp/dimens_material.xml b/core/res/res/values-w240dp/dimens_material.xml index a4b58fa95c50..bd26c8bf84df 100644 --- a/core/res/res/values-w240dp/dimens_material.xml +++ b/core/res/res/values-w240dp/dimens_material.xml @@ -14,7 +14,11 @@ limitations under the License. --> <resources> + <dimen name="screen_percentage_0416">9.98dp</dimen> <dimen name="screen_percentage_05">12dp</dimen> + <dimen name="screen_percentage_052">12.48dp</dimen> <dimen name="screen_percentage_10">24dp</dimen> + <dimen name="screen_percentage_12">28.8dp</dimen> <dimen name="screen_percentage_15">36dp</dimen> + <dimen name="screen_percentage_3646">87.5dp</dimen> </resources> diff --git a/core/res/res/values-watch-v36/colors.xml b/core/res/res/values-watch-v36/colors.xml deleted file mode 100644 index 4bc2a66fa206..000000000000 --- a/core/res/res/values-watch-v36/colors.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- - ~ Copyright (C) 2024 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> -<!-- TODO(b/372524566): update color token's value to match material3 design. --> -<resources> -</resources>
\ No newline at end of file diff --git a/core/res/res/values-watch-v36/dimens_material.xml b/core/res/res/values-watch-v36/dimens_material.xml deleted file mode 100644 index 7232786d92c9..000000000000 --- a/core/res/res/values-watch-v36/dimens_material.xml +++ /dev/null @@ -1,39 +0,0 @@ -<!-- - ~ Copyright (C) 2024 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> -<resources> - <!-- values for material3 button --> - <dimen name="btn_material_width">172dp</dimen> - <dimen name="btn_material_height">52dp</dimen> - <dimen name="btn_horizontal_edge_padding">14dp</dimen> - <dimen name="btn_drawable_padding">6dp</dimen> - <dimen name="btn_lineHeight">18sp</dimen> - <dimen name="btn_textSize">15sp</dimen> - - <!-- values for material3 AlertDialog --> - <dimen name="dialog_btn_negative_width">60dp</dimen> - <dimen name="dialog_btn_negative_height">60dp</dimen> - <dimen name="dialog_btn_confirm_width">62dp</dimen> - <dimen name="dialog_btn_confirm_height">60dp</dimen> - - <!-- Opacity factor for disabled material3 widget --> - <dimen name="disabled_alpha_device_default">0.12</dimen> - <dimen name="primary_content_alpha_device_default">0.38</dimen> - - <!-- values for material3 progress bar(progress indicator) --> - <item name="progressbar_inner_radius_ratio" format="float" type="dimen">2.12</item> - <dimen name="progressbar_thickness">8dp</dimen> - <dimen name="progressbar_elevation">0.1dp</dimen> -</resources> diff --git a/core/res/res/values-watch-v36/styles_material.xml b/core/res/res/values-watch-v36/styles_material.xml deleted file mode 100644 index 6e5ef68a70c3..000000000000 --- a/core/res/res/values-watch-v36/styles_material.xml +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2024 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<resources> - <!-- Button Styles --> - <!-- Material Button - Filled (primary colored) --> - <style name="Widget.DeviceDefault.Button.Filled" parent="Widget.DeviceDefault.Button.WearMaterial3"> - <item name="android:background">@drawable/btn_background_material_filled</item> - <item name="textAppearance">@style/TextAppearance.Widget.Button.Material.Filled</item> - </style> - - <!-- Material Button - Filled Tonal (Override system default button styles) --> - <style name="Widget.DeviceDefault.Button.WearMaterial3"> - <item name="background">@drawable/btn_background_material_filled_tonal</item> - <item name="textAppearance">@style/TextAppearance.Widget.Button.Material</item> - <item name="minHeight">@dimen/btn_material_height</item> - <item name="maxWidth">@dimen/btn_material_width</item> - <item name="android:paddingStart">@dimen/btn_horizontal_edge_padding</item> - <item name="android:paddingEnd">@dimen/btn_horizontal_edge_padding</item> - <item name="android:drawablePadding">@dimen/btn_drawable_padding</item> - <item name="android:maxLines">2</item> - <item name="android:ellipsize">end</item> - <item name="android:breakStrategy">simple</item> - <item name="stateListAnimator">@anim/button_state_list_anim_material</item> - <item name="focusable">true</item> - <item name="clickable">true</item> - <item name="gravity">center_vertical</item> - </style> - - <!-- Material Button - Outlined --> - <style name="Widget.DeviceDefault.Button.Outlined" parent="Widget.DeviceDefault.Button.WearMaterial3"> - <item name="android:background">@drawable/btn_background_material_outlined</item> - </style> - - <!-- Material Button - Text --> - <style name="Widget.DeviceDefault.Button.Text" parent="Widget.DeviceDefault.Button.WearMaterial3"> - <item name="android:background">@drawable/btn_background_material_text</item> - </style> - - <!-- Text Styles --> - <!-- TextAppearance for Material Button - Filled --> - <style name="TextAppearance.Widget.Button.Material.Filled"> - <item name="textColor">@color/btn_material_filled_content_color</item> - </style> - - <!-- TextAppearance for Material Button - Filled Tonal --> - <style name="TextAppearance.Widget.Button.Material" parent="TextAppearance.DeviceDefault"> - <item name="android:fontFamily">font-family-flex-device-default</item> - <item name="android:fontVariationSettings">"'wdth' 90, 'wght' 500, 'ROND' 100, 'opsz' 15, 'GRAD' 0"</item> - <item name="textSize">@dimen/btn_textSize</item> - <item name="textColor">@color/btn_material_filled_tonal_content_color</item> - <item name="lineHeight">@dimen/btn_lineHeight</item> - </style> - - <!-- AlertDialog Styles --> - <style name="AlertDialog.DeviceDefault.WearMaterial3"> - <item name="layout">@layout/alert_dialog_wear_material3</item> - </style> - - <style name="Widget.DeviceDefault.Button.ButtonBar.AlertDialog.WearMaterial3" parent="Widget.DeviceDefault.Button"> - <item name="android:textSize">0sp</item> - <item name="android:gravity">center</item> - <item name="android:paddingStart">0dp</item> - <item name="android:paddingEnd">0dp</item> - <item name="android:drawablePadding">0dp</item> - </style> - - <style name="Widget.DeviceDefault.Button.ButtonBar.AlertDialog.WearMaterial3.Confirm"> - <!-- Use a ImageView as background --> - <item name="background">@android:color/transparent</item> - <item name="minWidth">@dimen/dialog_btn_confirm_width</item> - <item name="minHeight">@dimen/dialog_btn_confirm_height</item> - </style> - - <style name="Widget.DeviceDefault.Button.ButtonBar.AlertDialog.WearMaterial3.Negative"> - <item name="background">@drawable/dialog_alert_button_negative</item> - <item name="minWidth">@dimen/dialog_btn_negative_width</item> - <item name="minHeight">@dimen/dialog_btn_negative_height</item> - <item name="maxWidth">@dimen/dialog_btn_negative_width</item> - <item name="maxHeight">@dimen/dialog_btn_negative_height</item> - </style> - - <!-- Wear Material3 Progress Bar style: progressed ring.--> - <style name="Widget.DeviceDefault.ProgressBar.WearMaterial3"> - <item name="indeterminateOnly">false</item> - <item name="progressDrawable">@drawable/progress_ring_wear_material3</item> - <item name="minHeight">@dimen/progress_bar_height</item> - <item name="maxHeight">@dimen/progress_bar_height</item> - <item name="mirrorForRtl">true</item> - </style> -</resources>
\ No newline at end of file diff --git a/core/res/res/values-watch/styles_device_default.xml b/core/res/res/values-watch/styles_device_default.xml deleted file mode 100644 index 8a2ce5da5985..000000000000 --- a/core/res/res/values-watch/styles_device_default.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2021 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<resources> - <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Material"> - <item name="maxLines">2</item> - <item name="shadowRadius">0</item> - <item name="ellipsize">end</item> - <item name="textAppearance">@style/TextAppearance.DeviceDefault.Title</item> - </style> - <style name="TextAppearance.DeviceDefault.Body1" parent="TextAppearance.Material.Body1"> - <item name="android:textSize">15sp</item> - <item name="android:fontFamily">sans-serif</item> - </style> - <style name="TextAppearance.DeviceDefault.Title" parent="TextAppearance.Material.Title"> - <item name="android:textSize">16sp</item> - <item name="android:fontFamily">google-sans</item> - <item name="android:textStyle">bold</item> - </style> - <style name="TextAppearance.DeviceDefault.Subhead" parent="TextAppearance.Material.Subhead"> - <item name="android:textSize">16sp</item> - <item name="android:fontFamily">google-sans-medium</item> - </style> - <style name="BaseErrorDialog.DeviceDefault" parent="AlertDialog.DeviceDefault"> - <item name="layout">@layout/watch_base_error_dialog</item> - </style> -</resources> diff --git a/core/res/res/values-watch/styles_device_defaults.xml b/core/res/res/values-watch/styles_device_defaults.xml new file mode 100644 index 000000000000..f3c85a96936f --- /dev/null +++ b/core/res/res/values-watch/styles_device_defaults.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2021 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Material"> + <item name="maxLines">2</item> + <item name="shadowRadius">0</item> + <item name="ellipsize">end</item> + <item name="textAppearance">@style/TextAppearance.DeviceDefault.Title</item> + </style> + <style name="TextAppearance.DeviceDefault.Body1" parent="TextAppearance.Material.Body1"> + <item name="android:textSize">15sp</item> + <item name="android:fontFamily">sans-serif</item> + </style> + <style name="TextAppearance.DeviceDefault.Title" parent="TextAppearance.Material.Title"> + <item name="android:textSize">16sp</item> + <item name="android:fontFamily">google-sans</item> + <item name="android:textStyle">bold</item> + </style> + <style name="TextAppearance.DeviceDefault.Subhead" parent="TextAppearance.Material.Subhead"> + <item name="android:textSize">16sp</item> + <item name="android:fontFamily">google-sans-medium</item> + </style> + <style name="BaseErrorDialog.DeviceDefault" parent="AlertDialog.DeviceDefault"> + <item name="layout">@layout/watch_base_error_dialog</item> + </style> + + <!-- Button Styles --> + <!-- Material Button - Filled (primary colored) --> + <style name="Widget.DeviceDefault.Button.Filled" parent="Widget.DeviceDefault.Button.WearMaterial3"> + <item name="android:background">@drawable/btn_background_material_filled_watch</item> + <item name="textAppearance">@style/TextAppearance.Widget.Button.Material.Filled</item> + </style> + + <!-- Material Button - Filled Tonal (Override system default button styles) --> + <style name="Widget.DeviceDefault.Button.WearMaterial3"> + <item name="background">@drawable/btn_background_material_filled_tonal_watch</item> + <item name="textAppearance">@style/TextAppearance.Widget.Button.Material</item> + <item name="minHeight">@dimen/btn_material_height</item> + <item name="maxWidth">@dimen/btn_material_width</item> + <item name="android:paddingStart">@dimen/btn_horizontal_edge_padding</item> + <item name="android:paddingEnd">@dimen/btn_horizontal_edge_padding</item> + <item name="android:drawablePadding">@dimen/btn_drawable_padding</item> + <item name="android:maxLines">2</item> + <item name="android:ellipsize">end</item> + <item name="android:breakStrategy">simple</item> + <item name="stateListAnimator">@anim/button_state_list_anim_material</item> + <item name="focusable">true</item> + <item name="clickable">true</item> + <item name="gravity">center_vertical</item> + </style> + + <!-- Wear Material3 Button - Outlined --> + <style name="Widget.DeviceDefault.Button.Outlined" parent="Widget.DeviceDefault.Button.WearMaterial3"> + <item name="android:background">@drawable/btn_background_material_outlined_watch</item> + </style> + + <!-- Wear Material3 Button - Text --> + <style name="Widget.DeviceDefault.Button.Text" parent="Widget.DeviceDefault.Button.WearMaterial3"> + <item name="android:background">@drawable/btn_background_material_text_watch</item> + </style> + + <!-- Wear Material3 AlertDialog Styles --> + <style name="AlertDialog.DeviceDefault.WearMaterial3"> + <item name="layout">@layout/alert_dialog_watch</item> + </style> + + <!-- Wear Material3 Progress Bar style: progressed ring.--> + <style name="Widget.DeviceDefault.ProgressBar.WearMaterial3"> + <item name="indeterminateOnly">false</item> + <item name="progressDrawable">@drawable/progress_ring_watch</item> + <item name="minHeight">@dimen/progress_bar_height</item> + <item name="maxHeight">@dimen/progress_bar_height</item> + <item name="mirrorForRtl">true</item> + </style> +</resources> diff --git a/core/res/res/values-watch/themes_device_defaults.xml b/core/res/res/values-watch/themes_device_defaults.xml index 7ac17595a278..60aec5342b4f 100644 --- a/core/res/res/values-watch/themes_device_defaults.xml +++ b/core/res/res/values-watch/themes_device_defaults.xml @@ -226,52 +226,6 @@ a similar way. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorInverseOnSurface">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorInversePrimary">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorInverseSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorError">@color/system_error_dark</item> </style> <!-- DeviceDefault theme for a window that should look like the Settings app. --> @@ -376,8 +330,8 @@ a similar way. <item name="secondaryContentAlpha">@dimen/secondary_content_alpha_device_default</item> </style> - <!-- DeviceDefault theme for a window that will be displayed either full-screen on smaller - screens (small, normal) or as a dialog on larger screens (large, xlarge). --> + <!-- DeviceDefault theme for a window that will be displayed either full-screen on smaller + screens (small, normal) or as a dialog on larger screens (large, xlarge). --> <style name="Theme.DeviceDefault.DialogWhenLarge" parent="Theme.Material.DialogWhenLarge"> <!-- Color palette Dark --> <item name="colorPrimary">@color/primary_device_default_dark</item> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 14e85574f413..120c08c75505 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>小时后"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>天后"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>年后"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> 分钟前"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> 小时前"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> 天前"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> 年前"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> 分钟"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> 小时"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> 天"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> 年"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> 分钟后"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> 小时后"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> 天后"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> 年后"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> 分钟前"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> 小时前"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> 天前"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> 年前"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# 分钟前}other{# 分钟前}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# 小时前}other{# 小时前}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# 天前}other{# 天前}}"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index c4079e00605b..9d6a2322fc48 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> 小時後"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> 天後"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> 年後"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> 分前"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> 小時前"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> 天前"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> 年前"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> 分鐘"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> 小時"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> 天"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> 年"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> 分鐘後"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> 小時前"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> 天後"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> 年後"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> 分鐘前"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> 小時前"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> 天前"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> 年前"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# 分鐘前}other{# 分鐘前}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# 小時前}other{# 小時前}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# 天前}other{# 天前}}"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 3c3a0ef23b84..7f22ab4a8d17 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> 小時後"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> 天後"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> 年後"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"<xliff:g id="COUNT">%d</xliff:g> 分鐘前"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"<xliff:g id="COUNT">%d</xliff:g> 小時前"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"<xliff:g id="COUNT">%d</xliff:g> 天前"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"<xliff:g id="COUNT">%d</xliff:g> 年前"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> 分鐘"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> 小時"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> 天"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> 年"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"<xliff:g id="COUNT">%d</xliff:g> 分鐘後"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"<xliff:g id="COUNT">%d</xliff:g> 小時後"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"<xliff:g id="COUNT">%d</xliff:g> 天後"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"<xliff:g id="COUNT">%d</xliff:g> 年後"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"<xliff:g id="COUNT">%d</xliff:g> 分鐘前"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"<xliff:g id="COUNT">%d</xliff:g> 小時前"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"<xliff:g id="COUNT">%d</xliff:g> 天前"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"<xliff:g id="COUNT">%d</xliff:g> 年前"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# 分鐘前}other{# 分鐘前}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# 小時前}other{# 小時前}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# 天前}other{# 天前}}"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index dc72cb7b9760..0ac3e4af9554 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1158,38 +1158,22 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ngehora elingu-<xliff:g id="COUNT">%d</xliff:g>"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"ngosuku olu-<xliff:g id="COUNT">%d</xliff:g>"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"ngonyaka ongu-<xliff:g id="COUNT">%d</xliff:g>"</string> - <!-- no translation found for duration_minutes_shortest_past (1740022450020492407) --> - <skip /> - <!-- no translation found for duration_hours_shortest_past (2098397414186628489) --> - <skip /> - <!-- no translation found for duration_days_shortest_past (1832006037955897625) --> - <skip /> - <!-- no translation found for duration_years_shortest_past (6168256514200469291) --> - <skip /> - <!-- no translation found for duration_minutes_medium (5891933490342643944) --> - <skip /> - <!-- no translation found for duration_hours_medium (1465359726485910115) --> - <skip /> - <!-- no translation found for duration_days_medium (5994225628248661388) --> - <skip /> - <!-- no translation found for duration_years_medium (734023884353592526) --> - <skip /> - <!-- no translation found for duration_minutes_medium_future (2750894988731934402) --> - <skip /> - <!-- no translation found for duration_hours_medium_future (6050833881463849764) --> - <skip /> - <!-- no translation found for duration_days_medium_future (1700821545602729963) --> - <skip /> - <!-- no translation found for duration_years_medium_future (3281018940397120166) --> - <skip /> - <!-- no translation found for duration_minutes_medium_past (7400424340181947714) --> - <skip /> - <!-- no translation found for duration_hours_medium_past (6709441336035202617) --> - <skip /> - <!-- no translation found for duration_days_medium_past (5748156261134344532) --> - <skip /> - <!-- no translation found for duration_years_medium_past (893797065424596243) --> - <skip /> + <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"Umzuzu ongu-<xliff:g id="COUNT">%d</xliff:g> odlule"</string> + <string name="duration_hours_shortest_past" msgid="2098397414186628489">"Ihora eli-<xliff:g id="COUNT">%d</xliff:g> eledlule"</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"Usuku olu-<xliff:g id="COUNT">%d</xliff:g> oludlule"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"Unyaka ongu-<xliff:g id="COUNT">%d</xliff:g> odlule"</string> + <string name="duration_minutes_medium" msgid="5891933490342643944">"Umzuzu o-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_hours_medium" msgid="1465359726485910115">"Ihora eli-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_days_medium" msgid="5994225628248661388">"Usuku olu-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_years_medium" msgid="734023884353592526">"Unyaka ongu-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_minutes_medium_future" msgid="2750894988731934402">"Emzuzwini ongu-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_hours_medium_future" msgid="6050833881463849764">"Emahoreni angu-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"Osukwini olu-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"onyakeni ongu-<xliff:g id="COUNT">%d</xliff:g>"</string> + <string name="duration_minutes_medium_past" msgid="7400424340181947714">"Umzuzu ongu-<xliff:g id="COUNT">%d</xliff:g> odlule"</string> + <string name="duration_hours_medium_past" msgid="6709441336035202617">"Ihora eli-<xliff:g id="COUNT">%d</xliff:g> eledlule"</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"Usuku olu-<xliff:g id="COUNT">%d</xliff:g> oludlule"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"Unyaka ongu-<xliff:g id="COUNT">%d</xliff:g> odlule"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{umzuzu odlule #}one{imizuzu edlule #}other{imizuzu edlule #}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{ihora elingu-# eledlule}one{amahora adlule angu-#}other{amahora adlule angu-#}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{usuku oludlule #}one{izinsuku ezedlule #}other{izinsuku ezedlule #}}"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 238aca556003..728c856f5855 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1217,178 +1217,6 @@ a value of 'true' will not override any 'false' value in its parent chain nor will it prevent any 'false' in any of its children. --> <attr name="forceDarkAllowed" format="boolean" /> - - <!-- Dynamic Tokens --> - - <!-- @hide --> - <attr name="materialColorBackground" format="color"/> - <!-- @hide --> - <attr name="materialColorControlActivated" format="color"/> - <!-- @hide --> - <attr name="materialColorControlHighlight" format="color"/> - <!-- @hide --> - <attr name="materialColorControlNormal" format="color"/> - <!-- @hide --> - <attr name="materialColorError" format="color"/> - <!-- @hide --> - <attr name="materialColorErrorContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorInverseOnSurface" format="color"/> - <!-- @hide --> - <attr name="materialColorInversePrimary" format="color"/> - <!-- @hide --> - <attr name="materialColorInverseSurface" format="color"/> - <!-- @hide --> - <attr name="materialColorOnBackground" format="color"/> - <!-- @hide --> - <attr name="materialColorOnError" format="color"/> - <!-- @hide --> - <attr name="materialColorOnErrorContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorOnPrimary" format="color"/> - <!-- @hide --> - <attr name="materialColorOnPrimaryContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorOnSecondary" format="color"/> - <!-- @hide --> - <attr name="materialColorOnSecondaryContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorOnSurface" format="color"/> - <!-- @hide --> - <attr name="materialColorOnSurfaceVariant" format="color"/> - <!-- @hide --> - <attr name="materialColorOnTertiary" format="color"/> - <!-- @hide --> - <attr name="materialColorOnTertiaryContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorOutline" format="color"/> - <!-- @hide --> - <attr name="materialColorOutlineVariant" format="color"/> - <!-- @hide --> - <attr name="materialColorPaletteKeyColorNeutral" format="color"/> - <!-- @hide --> - <attr name="materialColorPaletteKeyColorNeutralVariant" format="color"/> - <!-- @hide --> - <attr name="materialColorPaletteKeyColorPrimary" format="color"/> - <!-- @hide --> - <attr name="materialColorPaletteKeyColorSecondary" format="color"/> - <!-- @hide --> - <attr name="materialColorPaletteKeyColorTertiary" format="color"/> - <!-- @hide --> - <attr name="materialColorPrimary" format="color"/> - <!-- @hide --> - <attr name="materialColorPrimaryContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorScrim" format="color"/> - <!-- @hide --> - <attr name="materialColorSecondary" format="color"/> - <!-- @hide --> - <attr name="materialColorSecondaryContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorShadow" format="color"/> - <!-- @hide --> - <attr name="materialColorSurface" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceBright" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceContainerHigh" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceContainerHighest" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceContainerLow" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceContainerLowest" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceDim" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceTint" format="color"/> - <!-- @hide --> - <attr name="materialColorSurfaceVariant" format="color"/> - <!-- @hide --> - <attr name="materialColorTertiary" format="color"/> - <!-- @hide --> - <attr name="materialColorTertiaryContainer" format="color"/> - <!-- @hide --> - <attr name="materialColorTextHintInverse" format="color"/> - <!-- @hide --> - <attr name="materialColorTextPrimaryInverse" format="color"/> - <!-- @hide --> - <attr name="materialColorTextPrimaryInverseDisableOnly" format="color"/> - <!-- @hide --> - <attr name="materialColorTextSecondaryAndTertiaryInverse" format="color"/> - <!-- @hide --> - <attr name="materialColorTextSecondaryAndTertiaryInverseDisabled" format="color"/> - <!-- @hide --> - <attr name="materialColorOnPrimaryFixed" format="color"/> - <!-- @hide --> - <attr name="materialColorOnPrimaryFixedVariant" format="color"/> - <!-- @hide --> - <attr name="materialColorOnSecondaryFixed" format="color"/> - <!-- @hide --> - <attr name="materialColorOnSecondaryFixedVariant" format="color"/> - <!-- @hide --> - <attr name="materialColorOnTertiaryFixed" format="color"/> - <!-- @hide --> - <attr name="materialColorOnTertiaryFixedVariant" format="color"/> - <!-- @hide --> - <attr name="materialColorPrimaryFixed" format="color"/> - <!-- @hide --> - <attr name="materialColorPrimaryFixedDim" format="color"/> - <!-- @hide --> - <attr name="materialColorSecondaryFixed" format="color"/> - <!-- @hide --> - <attr name="materialColorSecondaryFixedDim" format="color"/> - <!-- @hide --> - <attr name="materialColorTertiaryFixed" format="color"/> - <!-- @hide --> - <attr name="materialColorTertiaryFixedDim" format="color"/> - <!-- @hide --> - <attr name="customColorBrandA" format="color"/> - <!-- @hide --> - <attr name="customColorBrandB" format="color"/> - <!-- @hide --> - <attr name="customColorBrandC" format="color"/> - <!-- @hide --> - <attr name="customColorBrandD" format="color"/> - <!-- @hide --> - <attr name="customColorClockHour" format="color"/> - <!-- @hide --> - <attr name="customColorClockMinute" format="color"/> - <!-- @hide --> - <attr name="customColorClockSecond" format="color"/> - <!-- @hide --> - <attr name="customColorOnShadeActive" format="color"/> - <!-- @hide --> - <attr name="customColorOnShadeActiveVariant" format="color"/> - <!-- @hide --> - <attr name="customColorOnShadeInactive" format="color"/> - <!-- @hide --> - <attr name="customColorOnShadeInactiveVariant" format="color"/> - <!-- @hide --> - <attr name="customColorOnThemeApp" format="color"/> - <!-- @hide --> - <attr name="customColorOverviewBackground" format="color"/> - <!-- @hide --> - <attr name="customColorShadeActive" format="color"/> - <!-- @hide --> - <attr name="customColorShadeDisabled" format="color"/> - <!-- @hide --> - <attr name="customColorShadeInactive" format="color"/> - <!-- @hide --> - <attr name="customColorThemeApp" format="color"/> - <!-- @hide --> - <attr name="customColorThemeAppRing" format="color"/> - <!-- @hide --> - <attr name="customColorThemeNotif" format="color"/> - <!-- @hide --> - <attr name="customColorUnderSurface" format="color"/> - <!-- @hide --> - <attr name="customColorWeatherTemp" format="color"/> - <!-- @hide --> - <attr name="customColorWidgetBackground" format="color"/> - </declare-styleable> <!-- **************************************************************** --> @@ -4813,7 +4641,7 @@ role owner must opt into this behavior by using the property named by {@link android.nfc.cardemulation.CardEmulation.PROPERTY_ALLOW_SHARED_ROLE_PRIORITY } in the <code><application&rt;</code> tag. --> - <attr name="shareRolePriority" format="boolean"/> + <attr name="wantsRoleHolderPriority" format="boolean"/> </declare-styleable> <!-- Use <code>offhost-apdu-service</code> as the root tag of the XML resource that @@ -4841,7 +4669,7 @@ <!-- Whether the device should default to observe mode when this service is default or in the foreground. --> <attr name="shouldDefaultToObserveMode"/> - <attr name="shareRolePriority"/> + <attr name="wantsRoleHolderPriority"/> </declare-styleable> <!-- Specify one or more <code>aid-group</code> elements inside a diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 00c59c6c0edc..a06d184fd147 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -2572,7 +2572,9 @@ against a development branch, in which case it will only work against the development builds. --> <attr name="minSdkVersion" format="integer|string" /> - <!-- @FlaggedApi(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) --> + <!-- This is the minimum SDK major and minor version (e.g. "36.1") that + the application requires. Verified independently of minSdkVersion. + @FlaggedApi(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) --> <attr name="minSdkVersionFull" format="string" /> <!-- This is the SDK version number that the application is targeting. It is able to run on older versions (down to minSdkVersion), but diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 53b47622e8ae..89184bcc3721 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -7212,10 +7212,6 @@ screen. --> <bool name="config_dragToMaximizeInDesktopMode">false</bool> - <!-- Whether showing the app handle is supported on this device. - If config_isDesktopModeSupported, then this has no effect --> - <bool name="config_enableAppHandle">false</bool> - <!-- Frame rate compatibility value for Wallpaper FRAME_RATE_COMPATIBILITY_MIN (102) is used by default for lower power consumption --> <integer name="config_wallpaperFrameRateCompatibility">102</integer> diff --git a/core/res/res/values-watch-v36/config.xml b/core/res/res/values/config_watch.xml index 679dc709ec35..629a343f1280 100644 --- a/core/res/res/values-watch-v36/config.xml +++ b/core/res/res/values/config_watch.xml @@ -15,6 +15,8 @@ --> <resources> + <!-- TODO(b/382103556): use predefined Material3 token --> + <!-- For Wear Material3 --> <dimen name="config_wearMaterial3_buttonCornerRadius">26dp</dimen> <dimen name="config_wearMaterial3_bottomDialogCornerRadius">18dp</dimen> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index f53acbfac71d..51bd4cc6cc8a 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -912,6 +912,8 @@ <dimen name="conversation_icon_size_badged">20dp</dimen> <!-- size of the conversation avatar in an expanded group --> <dimen name="conversation_avatar_size_group_expanded">@dimen/messaging_avatar_size</dimen> + <!-- size of the face pile icons (2025 redesign version) --> + <dimen name="notification_2025_face_pile_avatar_size">24dp</dimen> <!-- size of the face pile icons --> <dimen name="conversation_face_pile_avatar_size">32dp</dimen> <!-- size of the face pile icons when the group is expanded --> @@ -939,6 +941,18 @@ <!-- The size of the importance ring --> <dimen name="importance_ring_size">20dp</dimen> + <!-- The spacing around the app icon badge shown next to the conversation icon --> + <dimen name="notification_2025_conversation_icon_badge_padding">2dp</dimen> + + <!-- Top and start margin for the app icon badge shown next to the conversation icon, to align + it to the bottom end corner. + 40dp (conversation icon size) - 16dp (actual size of badge) - 2dp (badge padding) --> + <dimen name="notification_2025_conversation_icon_badge_position">22dp</dimen> + + <!-- The size of the app icon badge shown next to the conversation icon, including its padding. + The actual size of the icon is 16dp, plus 2dp for each side for the padding. --> + <dimen name="notification_2025_conversation_icon_badge_size">20dp</dimen> + <!-- The top padding of the conversation icon container in the regular state--> <dimen name="conversation_icon_container_top_padding">20dp</dimen> diff --git a/core/res/res/values/dimens_watch.xml b/core/res/res/values/dimens_watch.xml new file mode 100644 index 000000000000..2aae98715973 --- /dev/null +++ b/core/res/res/values/dimens_watch.xml @@ -0,0 +1,64 @@ +<!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <!-- values for wear material3 button --> + <dimen name="btn_material_width">172dp</dimen> + <dimen name="btn_material_height">52dp</dimen> + <dimen name="btn_horizontal_edge_padding">14dp</dimen> + <dimen name="btn_drawable_padding">6dp</dimen> + <dimen name="btn_lineHeight">18sp</dimen> + <dimen name="btn_textSize">15sp</dimen> + + <!-- values for wear material3 AlertDialog Title --> + <dimen name="alertDialog_material_line_height_title">18sp</dimen> + <dimen name="alertDialog_material_text_size_title">16sp</dimen> + <item name="alertDialog_material_letter_spacing_title" format="float" type="dimen">0.0125</item> + <dimen name="alertDialog_material_side_margin_title">@dimen/screen_percentage_12</dimen> + + <!-- values for wear material3 AlertDialog Body --> + <dimen name="alertDialog_material_line_height_body_1">16sp</dimen> + <dimen name="alertDialog_material_text_size_body_1">14sp</dimen> + <item name="alertDialog_material_letter_spacing_body_1" format="float" type="dimen">0.0286</item> + <dimen name="alertDialog_material_side_margin_body">@dimen/screen_percentage_0416</dimen> + + <!-- values for wear material3 AlertDialog --> + <dimen name="dialog_btn_negative_width">60dp</dimen> + <dimen name="dialog_btn_negative_height">60dp</dimen> + <dimen name="dialog_btn_confirm_width">62dp</dimen> + <dimen name="dialog_btn_confirm_height">60dp</dimen> + <dimen name="alertDialog_material_side_margin">@dimen/screen_percentage_052</dimen> + <dimen name="alertDialog_material_top_margin">@dimen/screen_percentage_10</dimen> + <dimen name="alertDialog_material_bottom_margin">@dimen/screen_percentage_3646</dimen> + + <!-- Opacity factor for disabled wear material3 widget --> + <!-- Alpha transparency for widgets that set enablement/disablement programmatically + transparency is applied in the disabled state --> + <dimen name="disabled_alpha_device_default">0.12</dimen> + <!-- Alpha transparency applied to elements which are considered primary (e.g. primary text) --> + <dimen name="primary_content_alpha_device_default">0.38</dimen> + + <!-- values for wear material3 progress bar(progress indicator) --> + <item name="progressbar_inner_radius_ratio" format="float" type="dimen">2.12</item> + <dimen name="progressbar_thickness">8dp</dimen> + <dimen name="progressbar_elevation">0.1dp</dimen> + + <!-- Alpha transparency for wigets that set enablement/disablement programmatically + transparency is applied in the disabled state --> + <dimen name="disabled_alpha_wear_material3">0.12</dimen> + <!-- Alpha transparency applied to elements which are considered primary (e.g. primary text) --> + <dimen name="primary_content_alpha_wear_material3">0.38</dimen> +</resources> diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml index 6c73b0c45a41..8259ce3c0aee 100644 --- a/core/res/res/values/public-staging.xml +++ b/core/res/res/values/public-staging.xml @@ -134,7 +134,7 @@ <!-- @FlaggedApi(android.content.pm.Flags.FLAG_APP_COMPAT_OPTION_16KB) --> <public name="pageSizeCompat" /> <!-- @FlaggedApi(android.nfc.Flags.FLAG_NFC_ASSOCIATED_ROLE_SERVICES) --> - <public name="shareRolePriority"/> + <public name="wantsRoleHolderPriority"/> <!-- @FlaggedApi(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) --> <public name="minSdkVersionFull"/> </staging-public-group> @@ -157,6 +157,19 @@ <!-- @FlaggedApi(android.permission.flags.Flags.FLAG_SYSTEM_VENDOR_INTELLIGENCE_ROLE_ENABLED) @hide @SystemApi --> <public name="config_systemVendorIntelligence" /> + + <!-- @FlaggedApi(android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE_MODULE) + @hide @SystemApi --> + <public name="config_defaultOnDeviceIntelligenceService"></public> + + <!-- @FlaggedApi(android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE_MODULE) + @hide @SystemApi --> + <public name="config_defaultOnDeviceSandboxedInferenceService"></public> + + <!-- @FlaggedApi(android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE_MODULE) + @hide @SystemApi --> + <public name="config_defaultOnDeviceIntelligenceDeviceConfigNamespace"></public> + </staging-public-group> <staging-public-group type="dimen" first-id="0x01b30000"> diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index acc1ff8fb9db..326afba51fb2 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -44,6 +44,10 @@ easier. <item name="textColor">@color/btn_colored_text_material</item> </style> <style name="Widget.DeviceDefault.Button.WearMaterial3"/> + <style name="Widget.DeviceDefault.Button.WearMaterial3.Filled"/> + <style name="Widget.DeviceDefault.Button.WearMaterial3.FilledTonal"/> + <style name="Widget.DeviceDefault.Button.WearMaterial3.Outlined"/> + <style name="Widget.DeviceDefault.Button.WearMaterial3.Text"/> <style name="Widget.DeviceDefault.TextView" parent="Widget.Material.TextView" /> <style name="Widget.DeviceDefault.CheckedTextView" parent="Widget.Material.CheckedTextView"/> <style name="Widget.DeviceDefault.AutoCompleteTextView" parent="Widget.Material.AutoCompleteTextView"/> @@ -60,6 +64,7 @@ easier. <style name="Widget.DeviceDefault.ProgressBar.Small" parent="Widget.Material.ProgressBar.Small"/> <style name="Widget.DeviceDefault.ProgressBar.Small.Title" parent="Widget.Material.ProgressBar.Small.Title"/> <style name="Widget.DeviceDefault.ProgressBar.Large" parent="Widget.Material.ProgressBar.Large"/> + <style name="Widget.DeviceDefault.ProgressBar.WearMaterial3"/> <style name="Widget.DeviceDefault.SeekBar" parent="Widget.Material.SeekBar"/> <style name="Widget.DeviceDefault.RatingBar" parent="Widget.Material.RatingBar"/> <style name="Widget.DeviceDefault.RatingBar.Indicator" parent="Widget.Material.RatingBar.Indicator"/> @@ -430,6 +435,7 @@ easier. <!-- AlertDialog Styles --> <style name="AlertDialog.DeviceDefault" parent="AlertDialog.Material"/> <style name="AlertDialog.DeviceDefault.Light" parent="AlertDialog.Material.Light"/> + <style name="AlertDialog.DeviceDefault.WearMaterial3"/> <!-- Animation Styles --> <style name="Animation.DeviceDefault.Activity" parent="Animation.Material.Activity"/> diff --git a/core/res/res/values/styles_watch.xml b/core/res/res/values/styles_watch.xml new file mode 100644 index 000000000000..3cf1f9b80fc4 --- /dev/null +++ b/core/res/res/values/styles_watch.xml @@ -0,0 +1,73 @@ +<!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <!-- TextAppearance for Wear Material3 Button - Filled --> + <style name="TextAppearance.Widget.Button.Material.Filled"> + <item name="textColor">@color/btn_material_filled_content_color_watch</item> + </style> + + <!-- TextAppearance for Wear Material3 Button - Filled Tonal --> + <style name="TextAppearance.Widget.Button.Material" parent="TextAppearance.DeviceDefault"> + <item name="android:fontFamily">font-family-flex-device-default</item> + <item name="android:fontVariationSettings">"'wdth' 90, 'wght' 500, 'ROND' 100, 'opsz' 15, 'GRAD' 0"</item> + <item name="textSize">@dimen/btn_textSize</item> + <item name="textColor">@color/btn_material_filled_tonal_content_color_watch</item> + <item name="lineHeight">@dimen/btn_lineHeight</item> + </style> + + <style name="Widget.DeviceDefault.Button.ButtonBar.AlertDialog.WearMaterial3" parent="Widget.DeviceDefault.Button"> + <item name="android:textSize">0sp</item> + <item name="android:gravity">center</item> + <item name="android:paddingStart">0dp</item> + <item name="android:paddingEnd">0dp</item> + <item name="android:drawablePadding">0dp</item> + </style> + <style name="Widget.DeviceDefault.Button.ButtonBar.AlertDialog.WearMaterial3.Confirm"> + <!-- Use a ImageView as background --> + <item name="background">@android:color/transparent</item> + <item name="minWidth">@dimen/dialog_btn_confirm_width</item> + <item name="minHeight">@dimen/dialog_btn_confirm_height</item> + </style> + <style name="Widget.DeviceDefault.Button.ButtonBar.AlertDialog.WearMaterial3.Negative"> + <item name="background">@drawable/dialog_alert_button_negative_watch</item> + <item name="minWidth">@dimen/dialog_btn_negative_width</item> + <item name="minHeight">@dimen/dialog_btn_negative_height</item> + <item name="maxWidth">@dimen/dialog_btn_negative_width</item> + <item name="maxHeight">@dimen/dialog_btn_negative_height</item> + </style> + + <!-- TextAppearance for wear material3 AlertDialog Body --> + <style name="TextAppearance.AlertDialog.Body1" parent="TextAppearance.Material.Body1"> + <item name="android:fontFamily">font-family-flex-device-default</item> + <item name="android:fontVariationSettings">"'wdth' 90, 'wght' 450, 'ROND' 100, 'GRAD' 0"</item> + <item name="android:textSize">@dimen/alertDialog_material_text_size_body_1</item> + <item name="android:lineHeight">@dimen/alertDialog_material_line_height_body_1</item> + <item name="android:letterSpacing">@dimen/alertDialog_material_letter_spacing_body_1</item> + </style> + + <!-- TextAppearance for wear material3 AlertDialog Title --> + <style name="TextAppearance.AlertDialog.Title" parent="TextAppearance.Material.Title"> + <item name="android:fontFamily">font-family-flex-device-default</item> + <item name="android:fontVariationSettings">"'wdth' 100, 'wght' 550, 'ROND' 100, 'GRAD' 0"</item> + <item name="android:textSize">@dimen/alertDialog_material_text_size_title</item> + <item name="android:lineHeight">@dimen/alertDialog_material_line_height_title</item> + <item name="android:letterSpacing">@dimen/alertDialog_material_letter_spacing_title</item> + <item name="android:maxLines">2</item> + <item name="android:shadowRadius">0</item> + <item name="android:ellipsize">end</item> + </style> +</resources>
\ No newline at end of file diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 28de553f6063..6c01994b3c93 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -5445,133 +5445,51 @@ <java-symbol name="customColorWeatherTemp" type="color"/> <java-symbol name="customColorWidgetBackground" type="color"/> - <java-symbol type="attr" name="materialColorBackground"/> - <java-symbol type="attr" name="materialColorControlActivated"/> - <java-symbol type="attr" name="materialColorControlHighlight"/> - <java-symbol type="attr" name="materialColorControlNormal"/> - <java-symbol type="attr" name="materialColorError"/> - <java-symbol type="attr" name="materialColorErrorContainer"/> - <java-symbol type="attr" name="materialColorInverseOnSurface"/> - <java-symbol type="attr" name="materialColorInversePrimary"/> - <java-symbol type="attr" name="materialColorInverseSurface"/> - <java-symbol type="attr" name="materialColorOnBackground"/> - <java-symbol type="attr" name="materialColorOnError"/> - <java-symbol type="attr" name="materialColorOnErrorContainer"/> - <java-symbol type="attr" name="materialColorOnPrimary"/> - <java-symbol type="attr" name="materialColorOnPrimaryContainer"/> - <java-symbol type="attr" name="materialColorOnSecondary"/> - <java-symbol type="attr" name="materialColorOnSecondaryContainer"/> - <java-symbol type="attr" name="materialColorOnSurface"/> - <java-symbol type="attr" name="materialColorOnSurfaceVariant"/> - <java-symbol type="attr" name="materialColorOnTertiary"/> - <java-symbol type="attr" name="materialColorOnTertiaryContainer"/> - <java-symbol type="attr" name="materialColorOutline"/> - <java-symbol type="attr" name="materialColorOutlineVariant"/> - <java-symbol type="attr" name="materialColorPaletteKeyColorNeutral"/> - <java-symbol type="attr" name="materialColorPaletteKeyColorNeutralVariant"/> - <java-symbol type="attr" name="materialColorPaletteKeyColorPrimary"/> - <java-symbol type="attr" name="materialColorPaletteKeyColorSecondary"/> - <java-symbol type="attr" name="materialColorPaletteKeyColorTertiary"/> - <java-symbol type="attr" name="materialColorPrimary"/> - <java-symbol type="attr" name="materialColorPrimaryContainer"/> - <java-symbol type="attr" name="materialColorScrim"/> - <java-symbol type="attr" name="materialColorSecondary"/> - <java-symbol type="attr" name="materialColorSecondaryContainer"/> - <java-symbol type="attr" name="materialColorShadow"/> - <java-symbol type="attr" name="materialColorSurface"/> - <java-symbol type="attr" name="materialColorSurfaceBright"/> - <java-symbol type="attr" name="materialColorSurfaceContainer"/> - <java-symbol type="attr" name="materialColorSurfaceContainerHigh"/> - <java-symbol type="attr" name="materialColorSurfaceContainerHighest"/> - <java-symbol type="attr" name="materialColorSurfaceContainerLow"/> - <java-symbol type="attr" name="materialColorSurfaceContainerLowest"/> - <java-symbol type="attr" name="materialColorSurfaceDim"/> - <java-symbol type="attr" name="materialColorSurfaceTint"/> - <java-symbol type="attr" name="materialColorSurfaceVariant"/> - <java-symbol type="attr" name="materialColorTertiary"/> - <java-symbol type="attr" name="materialColorTertiaryContainer"/> - <java-symbol type="attr" name="materialColorTextHintInverse"/> - <java-symbol type="attr" name="materialColorTextPrimaryInverse"/> - <java-symbol type="attr" name="materialColorTextPrimaryInverseDisableOnly"/> - <java-symbol type="attr" name="materialColorTextSecondaryAndTertiaryInverse"/> - <java-symbol type="attr" name="materialColorTextSecondaryAndTertiaryInverseDisabled"/> - <java-symbol type="attr" name="materialColorOnPrimaryFixed"/> - <java-symbol type="attr" name="materialColorOnPrimaryFixedVariant"/> - <java-symbol type="attr" name="materialColorOnSecondaryFixed"/> - <java-symbol type="attr" name="materialColorOnSecondaryFixedVariant"/> - <java-symbol type="attr" name="materialColorOnTertiaryFixed"/> - <java-symbol type="attr" name="materialColorOnTertiaryFixedVariant"/> - <java-symbol type="attr" name="materialColorPrimaryFixed"/> - <java-symbol type="attr" name="materialColorPrimaryFixedDim"/> - <java-symbol type="attr" name="materialColorSecondaryFixed"/> - <java-symbol type="attr" name="materialColorSecondaryFixedDim"/> - <java-symbol type="attr" name="materialColorTertiaryFixed"/> - <java-symbol type="attr" name="materialColorTertiaryFixedDim"/> - <java-symbol type="attr" name="customColorBrandA"/> - <java-symbol type="attr" name="customColorBrandB"/> - <java-symbol type="attr" name="customColorBrandC"/> - <java-symbol type="attr" name="customColorBrandD"/> - <java-symbol type="attr" name="customColorClockHour"/> - <java-symbol type="attr" name="customColorClockMinute"/> - <java-symbol type="attr" name="customColorClockSecond"/> - <java-symbol type="attr" name="customColorOnShadeActive"/> - <java-symbol type="attr" name="customColorOnShadeActiveVariant"/> - <java-symbol type="attr" name="customColorOnShadeInactive"/> - <java-symbol type="attr" name="customColorOnShadeInactiveVariant"/> - <java-symbol type="attr" name="customColorOnThemeApp"/> - <java-symbol type="attr" name="customColorOverviewBackground"/> - <java-symbol type="attr" name="customColorShadeActive"/> - <java-symbol type="attr" name="customColorShadeDisabled"/> - <java-symbol type="attr" name="customColorShadeInactive"/> - <java-symbol type="attr" name="customColorThemeApp"/> - <java-symbol type="attr" name="customColorThemeAppRing"/> - <java-symbol type="attr" name="customColorThemeNotif"/> - <java-symbol type="attr" name="customColorUnderSurface"/> - <java-symbol type="attr" name="customColorWeatherTemp"/> - <java-symbol type="attr" name="customColorWidgetBackground"/> - - <java-symbol name="system_widget_background_light" type="color"/> - <java-symbol name="system_clock_hour_light" type="color"/> - <java-symbol name="system_clock_minute_light" type="color"/> - <java-symbol name="system_clock_second_light" type="color"/> - <java-symbol name="system_theme_app_light" type="color"/> - <java-symbol name="system_on_theme_app_light" type="color"/> - <java-symbol name="system_theme_app_ring_light" type="color"/> - <java-symbol name="system_theme_notif_light" type="color"/> <java-symbol name="system_brand_a_light" type="color"/> <java-symbol name="system_brand_b_light" type="color"/> <java-symbol name="system_brand_c_light" type="color"/> <java-symbol name="system_brand_d_light" type="color"/> - <java-symbol name="system_under_surface_light" type="color"/> - <java-symbol name="system_shade_active_light" type="color"/> + <java-symbol name="system_clock_hour_light" type="color"/> + <java-symbol name="system_clock_minute_light" type="color"/> + <java-symbol name="system_clock_second_light" type="color"/> <java-symbol name="system_on_shade_active_light" type="color"/> <java-symbol name="system_on_shade_active_variant_light" type="color"/> - <java-symbol name="system_shade_inactive_light" type="color"/> <java-symbol name="system_on_shade_inactive_light" type="color"/> <java-symbol name="system_on_shade_inactive_variant_light" type="color"/> - <java-symbol name="system_shade_disabled_light" type="color"/> + <java-symbol name="system_on_theme_app_light" type="color"/> <java-symbol name="system_overview_background_light" type="color"/> - <java-symbol name="system_widget_background_dark" type="color"/> - <java-symbol name="system_clock_hour_dark" type="color"/> - <java-symbol name="system_clock_minute_dark" type="color"/> - <java-symbol name="system_clock_second_dark" type="color"/> - <java-symbol name="system_theme_app_dark" type="color"/> - <java-symbol name="system_on_theme_app_dark" type="color"/> - <java-symbol name="system_theme_app_ring_dark" type="color"/> - <java-symbol name="system_theme_notif_dark" type="color"/> + <java-symbol name="system_shade_active_light" type="color"/> + <java-symbol name="system_shade_disabled_light" type="color"/> + <java-symbol name="system_shade_inactive_light" type="color"/> + <java-symbol name="system_theme_app_light" type="color"/> + <java-symbol name="system_theme_app_ring_light" type="color"/> + <java-symbol name="system_theme_notif_light" type="color"/> + <java-symbol name="system_under_surface_light" type="color"/> + <java-symbol name="system_weather_temp_light" type="color"/> + <java-symbol name="system_widget_background_light" type="color"/> + <java-symbol name="system_brand_a_dark" type="color"/> <java-symbol name="system_brand_b_dark" type="color"/> <java-symbol name="system_brand_c_dark" type="color"/> <java-symbol name="system_brand_d_dark" type="color"/> - <java-symbol name="system_under_surface_dark" type="color"/> - <java-symbol name="system_shade_active_dark" type="color"/> + <java-symbol name="system_clock_hour_dark" type="color"/> + <java-symbol name="system_clock_minute_dark" type="color"/> + <java-symbol name="system_clock_second_dark" type="color"/> <java-symbol name="system_on_shade_active_dark" type="color"/> <java-symbol name="system_on_shade_active_variant_dark" type="color"/> - <java-symbol name="system_shade_inactive_dark" type="color"/> <java-symbol name="system_on_shade_inactive_dark" type="color"/> <java-symbol name="system_on_shade_inactive_variant_dark" type="color"/> - <java-symbol name="system_shade_disabled_dark" type="color"/> + <java-symbol name="system_on_theme_app_dark" type="color"/> <java-symbol name="system_overview_background_dark" type="color"/> + <java-symbol name="system_shade_active_dark" type="color"/> + <java-symbol name="system_shade_disabled_dark" type="color"/> + <java-symbol name="system_shade_inactive_dark" type="color"/> + <java-symbol name="system_theme_app_dark" type="color"/> + <java-symbol name="system_theme_app_ring_dark" type="color"/> + <java-symbol name="system_theme_notif_dark" type="color"/> + <java-symbol name="system_under_surface_dark" type="color"/> + <java-symbol name="system_weather_temp_dark" type="color"/> + <java-symbol name="system_widget_background_dark" type="color"/> <java-symbol type="attr" name="actionModeUndoDrawable" /> <java-symbol type="attr" name="actionModeRedoDrawable" /> @@ -5763,9 +5681,6 @@ screen. --> <java-symbol type="bool" name="config_dragToMaximizeInDesktopMode" /> - <!-- Whether showing the app handle is supported on this device --> - <java-symbol type="bool" name="config_enableAppHandle" /> - <!-- Frame rate compatibility value for Wallpaper --> <java-symbol type="integer" name="config_wallpaperFrameRateCompatibility" /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index d8346d87f624..6b3d4271a609 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -131,7 +131,7 @@ easier. <item name="progressBarStyleSmallInverse">@style/Widget.DeviceDefault.ProgressBar.Small.Inverse</item> <item name="progressBarStyleLargeInverse">@style/Widget.DeviceDefault.ProgressBar.Large.Inverse</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="seekBarStyle">@style/Widget.DeviceDefault.SeekBar</item> <item name="ratingBarStyle">@style/Widget.DeviceDefault.RatingBar</item> <item name="ratingBarStyleIndicator">@style/Widget.DeviceDefault.RatingBar.Indicator</item> @@ -238,91 +238,6 @@ easier. <item name="textColorOnAccent">@color/system_on_primary_dark</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <style name="Theme.DeviceDefault" parent="Theme.DeviceDefaultBase" /> @@ -368,96 +283,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar. This theme @@ -502,96 +332,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar and @@ -638,96 +383,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent @@ -773,96 +433,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be @@ -916,96 +491,11 @@ easier. <item name="alertDialogTheme">@style/Theme.DeviceDefault.Dialog.Alert</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog} that has a nice minimum width for a @@ -1050,96 +540,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog} without an action bar --> @@ -1183,96 +588,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog_NoActionBar} that has a nice minimum width @@ -1317,96 +637,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. --> @@ -1467,96 +702,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- DeviceDefault theme for a window without an action bar that will be displayed either @@ -1602,96 +752,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- DeviceDefault theme for a presentation window on a secondary display. --> @@ -1735,96 +800,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- DeviceDefault theme for panel windows. This removes all extraneous window @@ -1870,96 +850,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear @@ -2004,96 +899,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear @@ -2138,96 +948,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- DeviceDefault style for input methods, which is used by the @@ -2272,96 +997,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- DeviceDefault style for input methods, which is used by the @@ -2406,96 +1046,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Material.Dialog.Alert"> @@ -2540,96 +1095,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Theme for the dialog shown when an app crashes or ANRs. --> @@ -2679,96 +1149,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Material.Dialog.NoFrame"> @@ -2811,96 +1196,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style --> @@ -2982,7 +1282,7 @@ easier. <item name="progressBarStyleSmallInverse">@style/Widget.DeviceDefault.Light.ProgressBar.Small.Inverse</item> <item name="progressBarStyleLargeInverse">@style/Widget.DeviceDefault.Light.ProgressBar.Large.Inverse</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="seekBarStyle">@style/Widget.DeviceDefault.Light.SeekBar</item> <item name="ratingBarStyle">@style/Widget.DeviceDefault.Light.RatingBar</item> <item name="ratingBarStyleIndicator">@style/Widget.DeviceDefault.Light.RatingBar.Indicator</item> @@ -3086,91 +1386,6 @@ easier. <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> <item name="colorPopupBackground">?attr/colorBackgroundFloating</item> <item name="panelColorBackground">?attr/colorBackgroundFloating</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of the DeviceDefault (light) theme that has a solid (opaque) action bar with an @@ -3215,96 +1430,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar --> @@ -3348,96 +1478,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar. @@ -3482,96 +1527,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar @@ -3618,96 +1578,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent @@ -3753,96 +1628,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- DeviceDefault light theme for dialog windows and activities. This changes the window to be @@ -3894,96 +1684,11 @@ easier. <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} that has a nice minimum width for a @@ -4031,96 +1736,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} without an action bar --> @@ -4167,96 +1787,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog_NoActionBar} that has a nice minimum @@ -4304,96 +1839,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. --> @@ -4427,91 +1877,6 @@ easier. <item name="textColorOnAccent">@color/system_on_primary_dark</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of Theme.DeviceDefault.Dialog.NoActionBar that has a fixed size. --> @@ -4545,91 +1910,6 @@ easier. <item name="textColorOnAccent">@color/system_on_primary_dark</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- DeviceDefault light theme for a window that will be displayed either full-screen on smaller @@ -4677,96 +1957,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- DeviceDefault light theme for a window without an action bar that will be displayed either @@ -4815,96 +2010,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- DeviceDefault light theme for a presentation window on a secondary display. --> @@ -4951,96 +2061,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- DeviceDefault light theme for panel windows. This removes all extraneous window @@ -5086,96 +2111,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Material.Light.Dialog.Alert"> @@ -5220,96 +2160,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Dialog.Alert.DayNight" parent="Theme.DeviceDefault.Light.Dialog.Alert" /> @@ -5354,96 +2209,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Light.Voice" parent="Theme.Material.Light.Voice"> @@ -5486,96 +2256,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- DeviceDefault theme for a window that should look like the Settings app. --> @@ -5631,90 +2316,6 @@ easier. <item name="colorListDivider">@color/list_divider_color_light</item> <item name="opacityListDivider">@color/list_divider_opacity_device_default_light</item> - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.SystemUI" parent="Theme.DeviceDefault.Light"> @@ -5745,96 +2346,12 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.SystemUI.Dialog" parent="Theme.DeviceDefault.Light.Dialog"> @@ -5857,96 +2374,12 @@ easier. <item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Settings_Dark} with no action bar --> @@ -5991,96 +2424,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <style name="Theme.DeviceDefault.Settings.DialogBase" parent="Theme.Material.Light.BaseDialog"> @@ -6114,91 +2462,6 @@ easier. <!-- Dialog attributes --> <item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Settings.Dialog" parent="Theme.DeviceDefault.Settings.DialogBase"> @@ -6216,7 +2479,7 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> @@ -6267,96 +2530,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.Alert"> @@ -6403,96 +2581,11 @@ easier. <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item> <!-- Progress bar attributes --> - <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item> + <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item> <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item> <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Settings.Dialog.NoActionBar" parent="Theme.DeviceDefault.Light.Dialog.NoActionBar" /> @@ -6570,91 +2663,6 @@ easier. <item name="colorAccentPrimary">@color/accent_primary_device_default</item> <item name="colorAccentSecondary">@color/system_secondary_dark</item> <item name="colorAccentTertiary">@color/system_tertiary_dark</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <style name="ThemeOverlay.DeviceDefault.Accent.Light"> @@ -6662,91 +2670,6 @@ easier. <item name="colorAccentPrimary">@color/accent_primary_device_default</item> <item name="colorAccentSecondary">@color/system_secondary_dark</item> <item name="colorAccentTertiary">@color/system_tertiary_dark</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <!-- Theme overlay that replaces colorAccent with the colorAccent from {@link #Theme_DeviceDefault_DayNight}. --> @@ -6758,91 +2681,6 @@ easier. <item name="colorAccentPrimary">@color/accent_primary_device_default</item> <item name="colorAccentSecondary">@color/system_secondary_dark</item> <item name="colorAccentTertiary">@color/system_tertiary_dark</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <style name="Theme.DeviceDefault.Light.Dialog.Alert.UserSwitchingDialog" parent="Theme.DeviceDefault.NoActionBar.Fullscreen"> @@ -6850,91 +2688,6 @@ easier. <item name="colorBackgroundFloating">@color/background_device_default_light</item> <item name="layout_gravity">center</item> <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item> - - <item name="materialColorBackground">@color/system_background_light</item> - <item name="materialColorControlActivated">@color/system_control_activated_light</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_light</item> - <item name="materialColorControlNormal">@color/system_control_normal_light</item> - <item name="materialColorError">@color/system_error_light</item> - <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item> - <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorOnError">@color/system_on_error_light</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnPrimary">@color/system_on_primary_light</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> - <item name="materialColorOnSurface">@color/system_on_surface_light</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> - <item name="materialColorOutline">@color/system_outline_light</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item> - <item name="materialColorPrimary">@color/system_primary_light</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> - <item name="materialColorScrim">@color/system_scrim_light</item> - <item name="materialColorSecondary">@color/system_secondary_light</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> - <item name="materialColorShadow">@color/system_shadow_light</item> - <item name="materialColorSurface">@color/system_surface_light</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> - <item name="materialColorTertiary">@color/system_tertiary_light</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_light</item> - <item name="customColorBrandB">@color/system_brand_b_light</item> - <item name="customColorBrandC">@color/system_brand_c_light</item> - <item name="customColorBrandD">@color/system_brand_d_light</item> - <item name="customColorClockHour">@color/system_clock_hour_light</item> - <item name="customColorClockMinute">@color/system_clock_minute_light</item> - <item name="customColorClockSecond">@color/system_clock_second_light</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item> - <item name="customColorOverviewBackground">@color/system_overview_background_light</item> - <item name="customColorShadeActive">@color/system_shade_active_light</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_light</item> - <item name="customColorThemeApp">@color/system_theme_app_light</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item> - <item name="customColorThemeNotif">@color/system_theme_notif_light</item> - <item name="customColorUnderSurface">@color/system_under_surface_light</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_light</item> - <item name="customColorWidgetBackground">@color/system_widget_background_light</item> </style> <style name="Theme.DeviceDefault.Notification" parent="@style/Theme.Material.Notification"> @@ -6953,91 +2706,6 @@ easier. <item name="colorAccentPrimary">@color/system_accent1_100</item> <item name="textColorPrimary">@color/system_neutral1_900</item> <item name="textColorSecondary">@color/system_neutral2_700</item> - - <item name="materialColorBackground">@color/system_background_dark</item> - <item name="materialColorControlActivated">@color/system_control_activated_dark</item> - <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item> - <item name="materialColorControlNormal">@color/system_control_normal_dark</item> - <item name="materialColorError">@color/system_error_dark</item> - <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item> - <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item> - <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item> - <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorOnError">@color/system_on_error_dark</item> - <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> - <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> - <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> - <item name="materialColorOnSurface">@color/system_on_surface_dark</item> - <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item> - <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> - <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> - <item name="materialColorOutline">@color/system_outline_dark</item> - <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item> - <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item> - <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item> - <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item> - <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item> - <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item> - <item name="materialColorPrimary">@color/system_primary_dark</item> - <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> - <item name="materialColorScrim">@color/system_scrim_dark</item> - <item name="materialColorSecondary">@color/system_secondary_dark</item> - <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> - <item name="materialColorShadow">@color/system_shadow_dark</item> - <item name="materialColorSurface">@color/system_surface_dark</item> - <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item> - <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item> - <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> - <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> - <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item> - <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> - <item name="materialColorTertiary">@color/system_tertiary_dark</item> - <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item> - <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item> - <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item> - <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> - <item name="customColorBrandA">@color/system_brand_a_dark</item> - <item name="customColorBrandB">@color/system_brand_b_dark</item> - <item name="customColorBrandC">@color/system_brand_c_dark</item> - <item name="customColorBrandD">@color/system_brand_d_dark</item> - <item name="customColorClockHour">@color/system_clock_hour_dark</item> - <item name="customColorClockMinute">@color/system_clock_minute_dark</item> - <item name="customColorClockSecond">@color/system_clock_second_dark</item> - <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item> - <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item> - <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item> - <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item> - <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item> - <item name="customColorOverviewBackground">@color/system_overview_background_dark</item> - <item name="customColorShadeActive">@color/system_shade_active_dark</item> - <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item> - <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item> - <item name="customColorThemeApp">@color/system_theme_app_dark</item> - <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item> - <item name="customColorThemeNotif">@color/system_theme_notif_dark</item> - <item name="customColorUnderSurface">@color/system_under_surface_dark</item> - <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item> - <item name="customColorWidgetBackground">@color/system_widget_background_dark</item> </style> <style name="Theme.DeviceDefault.AutofillHalfScreenDialogList" parent="Theme.DeviceDefault.DayNight"> <item name="colorListDivider">@color/list_divider_opacity_device_default_light</item> diff --git a/core/tests/coretests/src/android/app/NotificationManagerTest.java b/core/tests/coretests/src/android/app/NotificationManagerTest.java new file mode 100644 index 000000000000..3213abe13d8a --- /dev/null +++ b/core/tests/coretests/src/android/app/NotificationManagerTest.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.atMost; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.annotations.Presubmit; +import android.platform.test.flag.junit.SetFlagsRule; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.time.Instant; +import java.time.InstantSource; + +@RunWith(AndroidJUnit4.class) +@SmallTest +@Presubmit +public class NotificationManagerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + + private Context mContext; + private NotificationManagerWithMockService mNotificationManager; + private final FakeClock mClock = new FakeClock(); + + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + mNotificationManager = new NotificationManagerWithMockService(mContext, mClock); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void notify_rapidUpdate_isThrottled() throws Exception { + Notification n = exampleNotification(); + + for (int i = 0; i < 100; i++) { + mNotificationManager.notify(1, n); + mClock.advanceByMillis(5); + } + + verify(mNotificationManager.mBackendService, atMost(30)).enqueueNotificationWithTag(any(), + any(), any(), anyInt(), any(), anyInt()); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void notify_reasonableUpdate_isNotThrottled() throws Exception { + Notification n = exampleNotification(); + + for (int i = 0; i < 100; i++) { + mNotificationManager.notify(1, n); + mClock.advanceByMillis(300); + } + + verify(mNotificationManager.mBackendService, times(100)).enqueueNotificationWithTag(any(), + any(), any(), anyInt(), any(), anyInt()); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void notify_rapidAdd_isNotThrottled() throws Exception { + Notification n = exampleNotification(); + + for (int i = 0; i < 100; i++) { + mNotificationManager.notify(i, n); + mClock.advanceByMillis(5); + } + + verify(mNotificationManager.mBackendService, times(100)).enqueueNotificationWithTag(any(), + any(), any(), anyInt(), any(), anyInt()); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void notify_rapidAddAndCancel_isNotThrottled() throws Exception { + Notification n = exampleNotification(); + + for (int i = 0; i < 100; i++) { + mNotificationManager.notify(1, n); + mNotificationManager.cancel(1); + mClock.advanceByMillis(5); + } + + verify(mNotificationManager.mBackendService, times(100)).enqueueNotificationWithTag(any(), + any(), any(), anyInt(), any(), anyInt()); + } + + private Notification exampleNotification() { + return new Notification.Builder(mContext, "channel") + .setSmallIcon(android.R.drawable.star_big_on) + .build(); + } + + private static class NotificationManagerWithMockService extends NotificationManager { + + private final INotificationManager mBackendService; + + NotificationManagerWithMockService(Context context, InstantSource clock) { + super(context, clock); + mBackendService = mock(INotificationManager.class); + } + + @Override + public INotificationManager service() { + return mBackendService; + } + } + + private static class FakeClock implements InstantSource { + + private long mNowMillis = 441644400000L; + + @Override + public Instant instant() { + return Instant.ofEpochMilli(mNowMillis); + } + + private void advanceByMillis(long millis) { + mNowMillis += millis; + } + } +} diff --git a/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java b/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java index 6d2dd5355ff0..ff3abae29b4a 100644 --- a/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java +++ b/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java @@ -33,7 +33,6 @@ import android.content.pm.parsing.result.ParseTypeImpl; import android.os.FileUtils; import android.os.ParcelFileDescriptor; import android.platform.test.annotations.Presubmit; -import android.platform.test.annotations.RequiresFlagsEnabled; import android.util.ArraySet; import android.util.PackageUtils; @@ -62,7 +61,6 @@ import java.util.List; import java.util.Set; @Presubmit -@RequiresFlagsEnabled(android.content.pm.Flags.FLAG_SDK_DEPENDENCY_INSTALLER) public class ApkLiteParseUtilsTest { @Rule diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteRawStatementTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteRawStatementTest.java index 6dad3b7b2ac4..51a43ac01d75 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteRawStatementTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteRawStatementTest.java @@ -1010,6 +1010,7 @@ public class SQLiteRawStatementTest { mDatabase.beginTransaction(); try { mDatabase.execSQL("CREATE TABLE t1 (i int, j int);"); + mDatabase.execSQL("INSERT INTO t1 (i, j) VALUES (2, 20)"); mDatabase.setTransactionSuccessful(); } finally { mDatabase.endTransaction(); @@ -1017,13 +1018,58 @@ public class SQLiteRawStatementTest { mDatabase.beginTransactionReadOnly(); try (SQLiteRawStatement s = mDatabase.createRawStatement("SELECT * from t1")) { - s.step(); - s.getColumnText(5); // out-of-range column + assertTrue(s.step()); + s.getColumnText(5); // out-of-range column: the range is [0,2). fail("JNI exception not thrown"); } catch (SQLiteBindOrColumnIndexOutOfRangeException e) { // Passing case. } finally { mDatabase.endTransaction(); } + + mDatabase.beginTransactionReadOnly(); + try (SQLiteRawStatement s = mDatabase.createRawStatement("SELECT * from t1")) { + // Do not step the statement. The column count will be zero. + s.getColumnText(5); // out-of-range column: never stepped. + fail("JNI exception not thrown"); + } catch (SQLiteMisuseException e) { + // Passing case. + } finally { + mDatabase.endTransaction(); + } + + mDatabase.beginTransactionReadOnly(); + try (SQLiteRawStatement s = mDatabase.createRawStatement("SELECT * from t1")) { + // Do not step the statement. The column count will be zero. + s.getColumnText(0); // out-of-range column: never stepped. + fail("JNI exception not thrown"); + } catch (SQLiteMisuseException e) { + // Passing case. + } finally { + mDatabase.endTransaction(); + } + + // Ensure that column names and column types can be fetched even if the statement is not + // stepped. A new SQL statement is created to avoid interaction from the statement cache. + mDatabase.beginTransactionReadOnly(); + try (SQLiteRawStatement s = mDatabase.createRawStatement("SELECT * from t1 WHERE j = 3")) { + // Do not step the statement. + assertEquals("i", s.getColumnName(0)); + assertEquals("j", s.getColumnName(1)); + } finally { + mDatabase.endTransaction(); + } + + mDatabase.beginTransactionReadOnly(); + try (SQLiteRawStatement s = mDatabase.createRawStatement("SELECT * from t1")) { + // Do not step the statement. + s.getColumnName(3); // out-of-range column + fail("JNI exception not thrown"); + } catch (SQLiteBindOrColumnIndexOutOfRangeException e) { + // Passing case. + } finally { + mDatabase.endTransaction(); + } + } } diff --git a/core/tests/coretests/src/android/view/ViewGroupTest.java b/core/tests/coretests/src/android/view/ViewGroupTest.java index 43c404e849fe..ae3ad36b532c 100644 --- a/core/tests/coretests/src/android/view/ViewGroupTest.java +++ b/core/tests/coretests/src/android/view/ViewGroupTest.java @@ -213,35 +213,6 @@ public class ViewGroupTest { assertTrue(autofillableViews.containsAll(Arrays.asList(viewA, viewC))); } - @Test - public void testMeasureCache() { - final int spec1 = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.AT_MOST); - final int spec2 = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.AT_MOST); - final Context context = getInstrumentation().getContext(); - final View child = new View(context); - final TestView parent = new TestView(context, 0); - parent.addView(child); - - child.setPadding(1, 2, 3, 4); - parent.measure(spec1, spec1); - assertEquals(4, parent.getMeasuredWidth()); - assertEquals(6, parent.getMeasuredHeight()); - - child.setPadding(5, 6, 7, 8); - parent.measure(spec2, spec2); - assertEquals(12, parent.getMeasuredWidth()); - assertEquals(14, parent.getMeasuredHeight()); - - // This ends the state of forceLayout. - parent.layout(0, 0, 50, 50); - - // The cached values should be cleared after the new setPadding is called. And the measured - // width and height should be up-to-date. - parent.measure(spec1, spec1); - assertEquals(12, parent.getMeasuredWidth()); - assertEquals(14, parent.getMeasuredHeight()); - } - private static void getUnobscuredTouchableRegion(Region outRegion, View view) { outRegion.set(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); final ViewParent parent = view.getParent(); @@ -269,19 +240,6 @@ public class ViewGroupTest { protected void onLayout(boolean changed, int l, int t, int r, int b) { // We don't layout this view. } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int measuredWidth = 0; - int measuredHeight = 0; - final int count = getChildCount(); - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - measuredWidth += child.getPaddingLeft() + child.getPaddingRight(); - measuredHeight += child.getPaddingTop() + child.getPaddingBottom(); - } - setMeasuredDimension(measuredWidth, measuredHeight); - } } public static class AutofillableTestView extends TestView { diff --git a/core/tests/overlaytests/device_self_targeting/Android.bp b/core/tests/overlaytests/device_self_targeting/Android.bp index 931eac515e31..14a3cdf98436 100644 --- a/core/tests/overlaytests/device_self_targeting/Android.bp +++ b/core/tests/overlaytests/device_self_targeting/Android.bp @@ -31,6 +31,7 @@ android_test { "androidx.test.ext.junit", "mockito-target-minus-junit4", "truth", + "flag-junit", ], optimize: { diff --git a/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java b/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java index 28d6545c8a5b..bcf1446b3467 100644 --- a/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java +++ b/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java @@ -16,6 +16,7 @@ package com.android.overlaytest; +import static android.content.res.Flags.FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO; import static android.content.Context.MODE_PRIVATE; import static android.content.pm.PackageManager.SIGNATURE_NO_MATCH; @@ -41,6 +42,8 @@ import android.os.FabricatedOverlayInternal; import android.os.FabricatedOverlayInternalEntry; import android.os.ParcelFileDescriptor; import android.os.UserHandle; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.util.Log; import android.util.Pair; import android.util.TypedValue; @@ -76,6 +79,8 @@ import java.util.List; */ @RunWith(AndroidJUnit4.class) public class OverlayManagerImplTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private static final String TAG = "OverlayManagerImplTest"; private static final String TARGET_COLOR_RES = "color/mycolor"; @@ -210,6 +215,22 @@ public class OverlayManagerImplTest { } @Test + @DisableFlags(FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO) + public void registerOverlay_forAndroidPackage_shouldFail() { + FabricatedOverlayInternal overlayInternal = + createOverlayWithName( + mOverlayName, + SYSTEM_APP_OVERLAYABLE, + "android", + List.of(Pair.create("color/white", Pair.create(null, Color.BLACK)))); + + assertThrows( + "Wrong target package name", + IllegalArgumentException.class, + () -> mOverlayManagerImpl.registerFabricatedOverlay(overlayInternal)); + } + + @Test public void getOverlayInfosForTarget_defaultShouldBeZero() { List<OverlayInfo> overlayInfos = mOverlayManagerImpl.getOverlayInfosForTarget(mContext.getPackageName()); diff --git a/core/tests/overlaytests/host/Android.bp b/core/tests/overlaytests/host/Android.bp index 634098074cca..9b7200436f02 100644 --- a/core/tests/overlaytests/host/Android.bp +++ b/core/tests/overlaytests/host/Android.bp @@ -28,14 +28,14 @@ java_test_host { test_suites: [ "device-tests", ], - target_required: [ - "OverlayHostTests_NonPlatformSignatureOverlay", - "OverlayHostTests_PlatformSignatureStaticOverlay", - "OverlayHostTests_PlatformSignatureOverlay", - "OverlayHostTests_UpdateOverlay", - "OverlayHostTests_FrameworkOverlayV1", - "OverlayHostTests_FrameworkOverlayV2", - "OverlayHostTests_AppOverlayV1", - "OverlayHostTests_AppOverlayV2", + device_common_data: [ + ":OverlayHostTests_NonPlatformSignatureOverlay", + ":OverlayHostTests_PlatformSignatureStaticOverlay", + ":OverlayHostTests_PlatformSignatureOverlay", + ":OverlayHostTests_UpdateOverlay", + ":OverlayHostTests_FrameworkOverlayV1", + ":OverlayHostTests_FrameworkOverlayV2", + ":OverlayHostTests_AppOverlayV1", + ":OverlayHostTests_AppOverlayV2", ], } diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml index 38ea4ac8d109..45952ea75b6f 100644 --- a/data/etc/com.android.systemui.xml +++ b/data/etc/com.android.systemui.xml @@ -94,5 +94,6 @@ <permission name="android.permission.CONTROL_UI_TRACING" /> <permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND" /> <permission name="android.permission.OVERRIDE_SYSTEM_KEY_BEHAVIOR_IN_FOCUSED_WINDOW"/> + <permission name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" /> </privapp-permissions> </permissions> diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index a26f5e383586..2c542ec31a20 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -419,6 +419,7 @@ applications that come with the platform <permission name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING" /> + <permission name="android.permission.REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_COMPUTER" /> <permission name="android.permission.REQUEST_COMPANION_SELF_MANAGED" /> <permission name="android.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE" /> @@ -606,6 +607,8 @@ applications that come with the platform <!-- Permission required for CTS test - IntrusionDetectionManagerTest --> <permission name="android.permission.READ_INTRUSION_DETECTION_STATE" /> <permission name="android.permission.MANAGE_INTRUSION_DETECTION_STATE" /> + <!-- Permission required for CTS test - KeyguardLockedStateApiTest --> + <permission name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" /> </privapp-permissions> <privapp-permissions package="com.android.statementservice"> diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig index 714d5e0de367..5f1fb4b44613 100644 --- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig +++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig @@ -132,13 +132,6 @@ flag { } flag { - name: "enable_bubble_bar_in_persistent_task_bar" - namespace: "multitasking" - description: "Enable bubble bar to be shown in the persistent task bar" - bug: "346391377" -} - -flag { name: "bubble_view_info_executors" namespace: "multitasking" description: "Use executors to inflate bubble views" diff --git a/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml b/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml index ab1ab984fd5f..87d36288cfd5 100644 --- a/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml +++ b/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml @@ -16,5 +16,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:alpha="0.35" android:color="?androidprv:attr/materialColorPrimaryContainer" /> + <item android:alpha="0.35" android:color="@androidprv:color/materialColorPrimaryContainer" /> </selector>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml index 640d184e641c..047f22fe0383 100644 --- a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml +++ b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml @@ -22,5 +22,5 @@ android:color="?androidprv:attr/colorAccentPrimary"/> <item android:state_selected="true" android:color="?androidprv:attr/colorAccentPrimary"/> - <item android:color="?androidprv:attr/materialColorOutlineVariant"/> + <item android:color="@androidprv:color/materialColorOutlineVariant"/> </selector>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml b/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml index 0f9b28a07bde..9741b94f3ddb 100644 --- a/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml +++ b/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_checked="true" - android:color="?androidprv:attr/materialColorPrimaryContainer"/> - <item android:color="?androidprv:attr/materialColorSurfaceContainer"/> + android:color="@androidprv:color/materialColorPrimaryContainer"/> + <item android:color="@androidprv:color/materialColorSurfaceContainer"/> </selector> diff --git a/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml b/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml index b928a0b20764..20e00e1a9b90 100644 --- a/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml +++ b/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml @@ -21,6 +21,6 @@ <solid android:color="@color/bubble_drop_target_background_color" /> <stroke android:width="1dp" - android:color="?androidprv:attr/materialColorPrimaryContainer" /> + android:color="@androidprv:color/materialColorPrimaryContainer" /> </shape> </inset> diff --git a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml index 657720ee6088..5acca45654f0 100644 --- a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml +++ b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml @@ -19,7 +19,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> <solid - android:color="?androidprv:attr/materialColorSurfaceContainerHigh" + android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> <corners android:radius="18sp" /> diff --git a/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml b/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml index 8fd2e68f6451..f4d1de89d7a3 100644 --- a/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml +++ b/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml @@ -17,7 +17,7 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceBright" /> + <solid android:color="@androidprv:color/materialColorSurfaceBright" /> <corners android:bottomLeftRadius="?android:attr/dialogCornerRadius" android:topLeftRadius="?android:attr/dialogCornerRadius" diff --git a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml deleted file mode 100644 index f3800e05148e..000000000000 --- a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2024 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:width="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:fillColor="#000000" - android:pathData="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"/> -</vector> diff --git a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_or_maximize_exit_button_dark.xml index 5260450e8a13..b6289e2d6dd7 100644 --- a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml +++ b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_or_maximize_exit_button_dark.xml @@ -21,6 +21,6 @@ android:viewportHeight="960" android:tint="?attr/colorControlNormal"> <path - android:fillColor="@android:color/white" - android:pathData="M240,840L240,720L120,720L120,640L320,640L320,840L240,840ZM640,840L640,640L840,640L840,720L720,720L720,840L640,840ZM120,320L120,240L240,240L240,120L320,120L320,320L120,320ZM640,320L640,120L720,120L720,240L840,240L840,320L640,320Z"/> + android:fillColor="@android:color/black" + android:pathData="M520,560L600,560L600,560ZM320,720Q287,720 263.5,696.5Q240,673 240,640L240,160Q240,127 263.5,103.5Q287,80 320,80L800,80Q833,80 856.5,103.5Q880,127 880,160L880,640Q880,673 856.5,696.5Q833,720 800,720L320,720ZM320,640L800,640Q800,640 800,640Q800,640 800,640L800,160Q800,160 800,160Q800,160 800,160L320,160Q320,160 320,160Q320,160 320,160L320,640Q320,640 320,640Q320,640 320,640ZM160,880Q127,880 103.5,856.5Q80,833 80,800L80,240L160,240L160,800Q160,800 160,800Q160,800 160,800L720,800L720,880L160,880ZM320,160L320,160Q320,160 320,160Q320,160 320,160L320,640Q320,640 320,640Q320,640 320,640L320,640Q320,640 320,640Q320,640 320,640L320,160Q320,160 320,160Q320,160 320,160Z"/> </vector> diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml index 15837adc2c77..5769a851a8f0 100644 --- a/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml +++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml @@ -18,5 +18,5 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <corners android:radius="@dimen/desktop_mode_handle_menu_corner_radius" /> - <solid android:color="?androidprv:attr/materialColorSurfaceBright" /> + <solid android:color="@androidprv:color/materialColorSurfaceBright" /> </shape> diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml index 9566f2f140c7..bab2c9582089 100644 --- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml +++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml @@ -17,6 +17,6 @@ <shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerLow" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerLow" /> <corners android:radius="@dimen/desktop_mode_maximize_menu_corner_radius" /> </shape> diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml index a30cfb74bf4a..b03b13427630 100644 --- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml +++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml @@ -20,6 +20,6 @@ android:shape="rectangle"> <corners android:radius="@dimen/desktop_mode_maximize_menu_buttons_outline_radius"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerLow"/> - <stroke android:width="1dp" android:color="?androidprv:attr/materialColorOutlineVariant"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainerLow"/> + <stroke android:width="1dp" android:color="@androidprv:color/materialColorOutlineVariant"/> </shape>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml index 645d24df7c26..b24d432cece0 100644 --- a/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml +++ b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml @@ -17,6 +17,6 @@ <shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerLow" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerLow" /> <corners android:radius="@dimen/desktop_windowing_education_promo_corner_radius" /> </shape> diff --git a/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml index 4e673e65e053..dd1a1b1dca13 100644 --- a/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml +++ b/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml @@ -18,7 +18,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:id="@+id/indicator_solid"> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorPrimaryContainer" /> + <solid android:color="@androidprv:color/materialColorPrimaryContainer" /> <corners android:radius="28dp" /> </shape> </item> @@ -26,7 +26,7 @@ <shape android:shape="rectangle"> <corners android:radius="28dp" /> <stroke android:width="1dp" - android:color="?androidprv:attr/materialColorPrimaryContainer"/> + android:color="@androidprv:color/materialColorPrimaryContainer"/> </shape> </item> </layer-list> diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml index f37fb8dbe118..527cc31f2f76 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml @@ -17,6 +17,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/> <corners android:radius="@dimen/letterbox_education_dialog_corner_radius"/> </shape>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml index 3fdd059ca982..5336b3a22897 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml @@ -32,7 +32,7 @@ </item> <item> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorPrimary"/> + <solid android:color="@androidprv:color/materialColorPrimary"/> <corners android:radius="@dimen/letterbox_education_dialog_button_radius"/> <padding android:left="@dimen/letterbox_education_dialog_horizontal_padding" android:top="@dimen/letterbox_education_dialog_vertical_padding" diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml index 67929dfc5f71..f45d7044423f 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml @@ -25,6 +25,6 @@ android:pathData="M0,0h32v32h-32z"/> <path android:pathData="M5.867,22.667C4.489,21.844 3.389,20.733 2.567,19.333C1.744,17.933 1.333,16.378 1.333,14.667C1.333,12.067 2.233,9.867 4.033,8.067C5.856,6.244 8.067,5.333 10.667,5.333C13.267,5.333 15.467,6.244 17.267,8.067C19.089,9.867 20,12.067 20,14.667C20,16.378 19.589,17.933 18.767,19.333C17.944,20.733 16.844,21.844 15.467,22.667H5.867ZM6.667,20H14.667C15.511,19.356 16.167,18.578 16.633,17.667C17.1,16.733 17.333,15.733 17.333,14.667C17.333,12.822 16.678,11.256 15.367,9.967C14.078,8.656 12.511,8 10.667,8C8.822,8 7.244,8.656 5.933,9.967C4.644,11.256 4,12.822 4,14.667C4,15.733 4.233,16.733 4.7,17.667C5.167,18.578 5.822,19.356 6.667,20ZM7.2,26.667C6.822,26.667 6.5,26.544 6.233,26.3C5.989,26.033 5.867,25.711 5.867,25.333C5.867,24.956 5.989,24.644 6.233,24.4C6.5,24.133 6.822,24 7.2,24H14.133C14.511,24 14.822,24.133 15.067,24.4C15.333,24.644 15.467,24.956 15.467,25.333C15.467,25.711 15.333,26.033 15.067,26.3C14.822,26.544 14.511,26.667 14.133,26.667H7.2ZM10.667,30.667C9.933,30.667 9.3,30.411 8.767,29.9C8.256,29.367 8,28.733 8,28H13.333C13.333,28.733 13.067,29.367 12.533,29.9C12.022,30.411 11.4,30.667 10.667,30.667ZM24.667,13.367C24.667,11.7 24.078,10.278 22.9,9.1C21.722,7.922 20.3,7.333 18.633,7.333C20.3,7.333 21.722,6.756 22.9,5.6C24.078,4.422 24.667,3 24.667,1.333C24.667,3 25.244,4.422 26.4,5.6C27.578,6.756 29,7.333 30.667,7.333C29,7.333 27.578,7.922 26.4,9.1C25.244,10.278 24.667,11.7 24.667,13.367Z" - android:fillColor="?androidprv:attr/materialColorPrimary"/> + android:fillColor="@androidprv:color/materialColorPrimary"/> </group> </vector>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml index 4207482260ba..4e77720bd18d 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml @@ -32,7 +32,7 @@ </item> <item> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorPrimary"/> + <solid android:color="@androidprv:color/materialColorPrimary"/> <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> <padding android:left="@dimen/letterbox_restart_dialog_horizontal_padding" android:top="@dimen/letterbox_restart_dialog_vertical_padding" diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml index 72cfeefceffb..90b314a58b8f 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml @@ -17,6 +17,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/> <corners android:radius="@dimen/letterbox_restart_dialog_corner_radius"/> </shape>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml index 816b35063b00..d64e63261ac9 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml @@ -32,9 +32,9 @@ </item> <item> <shape android:shape="rectangle"> - <stroke android:color="?androidprv:attr/materialColorOutlineVariant" + <stroke android:color="@androidprv:color/materialColorOutlineVariant" android:width="1dp"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/> <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> <padding android:left="@dimen/letterbox_restart_dialog_horizontal_padding" android:top="@dimen/letterbox_restart_dialog_vertical_padding" diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml index f13d26c7f89e..53b4a4b70ed3 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml @@ -25,6 +25,6 @@ android:pathData="M0,0h32v32h-32z"/> <path android:pathData="M8.533,25.333H10.667C11.044,25.333 11.356,25.467 11.6,25.733C11.867,25.978 12,26.289 12,26.667C12,27.044 11.867,27.367 11.6,27.633C11.356,27.878 11.044,28 10.667,28H5.333C4.956,28 4.633,27.878 4.367,27.633C4.122,27.367 4,27.044 4,26.667V21.333C4,20.956 4.122,20.644 4.367,20.4C4.633,20.133 4.956,20 5.333,20C5.711,20 6.022,20.133 6.267,20.4C6.533,20.644 6.667,20.956 6.667,21.333V23.467L9.867,20.267C10.111,20.022 10.422,19.9 10.8,19.9C11.178,19.9 11.489,20.022 11.733,20.267C11.978,20.511 12.1,20.822 12.1,21.2C12.1,21.578 11.978,21.889 11.733,22.133L8.533,25.333ZM23.467,25.333L20.267,22.133C20.022,21.889 19.9,21.578 19.9,21.2C19.9,20.822 20.022,20.511 20.267,20.267C20.511,20.022 20.822,19.9 21.2,19.9C21.578,19.9 21.889,20.022 22.133,20.267L25.333,23.467V21.333C25.333,20.956 25.456,20.644 25.7,20.4C25.967,20.133 26.289,20 26.667,20C27.044,20 27.356,20.133 27.6,20.4C27.867,20.644 28,20.956 28,21.333V26.667C28,27.044 27.867,27.367 27.6,27.633C27.356,27.878 27.044,28 26.667,28H21.333C20.956,28 20.633,27.878 20.367,27.633C20.122,27.367 20,27.044 20,26.667C20,26.289 20.122,25.978 20.367,25.733C20.633,25.467 20.956,25.333 21.333,25.333H23.467ZM6.667,8.533V10.667C6.667,11.044 6.533,11.367 6.267,11.633C6.022,11.878 5.711,12 5.333,12C4.956,12 4.633,11.878 4.367,11.633C4.122,11.367 4,11.044 4,10.667V5.333C4,4.956 4.122,4.644 4.367,4.4C4.633,4.133 4.956,4 5.333,4H10.667C11.044,4 11.356,4.133 11.6,4.4C11.867,4.644 12,4.956 12,5.333C12,5.711 11.867,6.033 11.6,6.3C11.356,6.544 11.044,6.667 10.667,6.667H8.533L11.733,9.867C11.978,10.111 12.1,10.422 12.1,10.8C12.1,11.178 11.978,11.489 11.733,11.733C11.489,11.978 11.178,12.1 10.8,12.1C10.422,12.1 10.111,11.978 9.867,11.733L6.667,8.533ZM25.333,8.533L22.133,11.733C21.889,11.978 21.578,12.1 21.2,12.1C20.822,12.1 20.511,11.978 20.267,11.733C20.022,11.489 19.9,11.178 19.9,10.8C19.9,10.422 20.022,10.111 20.267,9.867L23.467,6.667H21.333C20.956,6.667 20.633,6.544 20.367,6.3C20.122,6.033 20,5.711 20,5.333C20,4.956 20.122,4.644 20.367,4.4C20.633,4.133 20.956,4 21.333,4H26.667C27.044,4 27.356,4.133 27.6,4.4C27.867,4.644 28,4.956 28,5.333V10.667C28,11.044 27.867,11.367 27.6,11.633C27.356,11.878 27.044,12 26.667,12C26.289,12 25.967,11.878 25.7,11.633C25.456,11.367 25.333,11.044 25.333,10.667V8.533Z" - android:fillColor="?androidprv:attr/materialColorPrimary"/> + android:fillColor="@androidprv:color/materialColorPrimary"/> </group> </vector>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml index 4eb22712f5e1..d1a510a03674 100644 --- a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml +++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml @@ -17,6 +17,6 @@ <shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainer"/> <corners android:radius="28dp"/> </shape> diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml index 2b2e9df07dce..20e2e7e5a832 100644 --- a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml +++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml @@ -17,6 +17,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorPrimary"/> + <solid android:color="@androidprv:color/materialColorPrimary"/> <corners android:radius="50dp"/> </shape> diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml index 4c7d1c7339fb..7347fbad5f5d 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml @@ -29,7 +29,7 @@ <ImageView android:layout_width="@dimen/bubble_popup_icon_size" android:layout_height="@dimen/bubble_popup_icon_size" - android:tint="?androidprv:attr/materialColorOutline" + android:tint="@androidprv:color/materialColorOutline" android:contentDescription="@null" android:src="@drawable/pip_ic_settings"/> @@ -41,7 +41,7 @@ android:maxLines="1" android:ellipsize="end" android:textAppearance="@android:style/TextAppearance.DeviceDefault.Headline" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:text="@string/bubble_bar_education_manage_title"/> <TextView @@ -51,7 +51,7 @@ android:paddingBottom="@dimen/bubble_popup_padding_bottom" android:maxWidth="@dimen/bubble_popup_content_max_width" android:textAppearance="@android:style/TextAppearance.DeviceDefault" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:textAlignment="center" android:text="@string/bubble_bar_education_manage_text"/> diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml index e3217811ca29..5750ed7bf8d6 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml @@ -36,7 +36,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault" /> </com.android.wm.shell.bubbles.bar.BubbleBarMenuItemView>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml index 7aca921dccc7..cef4f5f960c2 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml @@ -50,8 +50,9 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_weight="1" - android:textColor="?androidprv:attr/materialColorOnSurface" - android:textAppearance="@*android:style/TextAppearance.DeviceDefault" /> + android:textColor="@androidprv:color/materialColorOnSurface" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault" + android:textDirection="locale" /> <ImageView android:id="@+id/bubble_bar_manage_menu_dismiss_icon" @@ -60,7 +61,7 @@ android:layout_marginStart="8dp" android:contentDescription="@null" android:src="@drawable/ic_expand_less" - app:tint="?androidprv:attr/materialColorOnSurface" /> + app:tint="@androidprv:color/materialColorOnSurface" /> </LinearLayout> diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml index 345c399652f9..f0e1871168dd 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml @@ -29,7 +29,7 @@ <ImageView android:layout_width="@dimen/bubble_popup_icon_size" android:layout_height="@dimen/bubble_popup_icon_size" - android:tint="?androidprv:attr/materialColorOutline" + android:tint="@androidprv:color/materialColorOutline" android:contentDescription="@null" android:src="@drawable/ic_floating_landscape"/> @@ -41,7 +41,7 @@ android:maxLines="1" android:ellipsize="end" android:textAppearance="@android:style/TextAppearance.DeviceDefault.Headline" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:text="@string/bubble_bar_education_stack_title"/> <TextView @@ -51,7 +51,7 @@ android:paddingBottom="@dimen/bubble_popup_padding_bottom" android:maxWidth="@dimen/bubble_popup_content_max_width" android:textAppearance="@android:style/TextAppearance.DeviceDefault" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:textAlignment="center" android:text="@string/bubble_bar_education_stack_text"/> diff --git a/libs/WindowManager/Shell/res/layout/bubble_flyout.xml b/libs/WindowManager/Shell/res/layout/bubble_flyout.xml index 65a07a718677..deabd564d80a 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_flyout.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_flyout.xml @@ -49,7 +49,7 @@ android:fontFamily="@*android:string/config_bodyFontFamilyMedium" android:maxLines="1" android:ellipsize="end" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"/> <TextView @@ -59,7 +59,7 @@ android:fontFamily="@*android:string/config_bodyFontFamily" android:maxLines="2" android:ellipsize="end" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"/> </LinearLayout> diff --git a/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml b/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml index f88d63d796ea..0c446df69563 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml @@ -28,6 +28,6 @@ android:focusable="true" android:text="@string/manage_bubbles_text" android:textSize="@*android:dimen/text_size_body_2_material" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:background="@drawable/bubble_manage_btn_bg" />
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml b/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml index d8ae9c8c64a6..4daaf9c6b57f 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml @@ -43,7 +43,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault" android:text="@string/bubble_dismiss_text" /> @@ -70,7 +70,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault" android:text="@string/bubbles_dont_bubble_conversation" /> @@ -98,7 +98,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault" /> </LinearLayout> diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml index bfd9c818a96e..b69563b46e06 100644 --- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml +++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml @@ -52,7 +52,7 @@ android:layout_height="wrap_content" tools:text="Gmail" android:importantForAccessibility="no" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textSize="14sp" android:textFontWeight="500" android:lineHeight="20dp" @@ -69,7 +69,7 @@ android:contentDescription="@string/collapse_menu_text" android:src="@drawable/ic_baseline_expand_more_24" android:rotation="180" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:background="?android:selectableItemBackgroundBorderless"/> </LinearLayout> @@ -89,7 +89,7 @@ android:layout_marginEnd="4dp" android:contentDescription="@string/fullscreen_text" android:src="@drawable/desktop_mode_ic_handle_menu_fullscreen" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:layout_weight="1" style="@style/DesktopModeHandleMenuWindowingButton"/> @@ -99,7 +99,7 @@ android:layout_marginEnd="4dp" android:contentDescription="@string/split_screen_text" android:src="@drawable/desktop_mode_ic_handle_menu_splitscreen" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:layout_weight="1" style="@style/DesktopModeHandleMenuWindowingButton"/> @@ -109,7 +109,7 @@ android:layout_marginEnd="4dp" android:contentDescription="@string/float_button_text" android:src="@drawable/desktop_mode_ic_handle_menu_floating" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:layout_weight="1" style="@style/DesktopModeHandleMenuWindowingButton"/> @@ -118,7 +118,7 @@ android:layout_marginStart="4dp" android:contentDescription="@string/desktop_text" android:src="@drawable/desktop_mode_ic_handle_menu_desktop" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:layout_weight="1" style="@style/DesktopModeHandleMenuWindowingButton"/> @@ -139,7 +139,7 @@ android:contentDescription="@string/screenshot_text" android:text="@string/screenshot_text" android:drawableStart="@drawable/desktop_mode_ic_handle_menu_screenshot" - android:drawableTint="?androidprv:attr/materialColorOnSurface" + android:drawableTint="@androidprv:color/materialColorOnSurface" style="@style/DesktopModeHandleMenuActionButton"/> <Button @@ -147,7 +147,7 @@ android:contentDescription="@string/new_window_text" android:text="@string/new_window_text" android:drawableStart="@drawable/desktop_mode_ic_handle_menu_new_window" - android:drawableTint="?androidprv:attr/materialColorOnSurface" + android:drawableTint="@androidprv:color/materialColorOnSurface" style="@style/DesktopModeHandleMenuActionButton" /> <Button @@ -155,7 +155,7 @@ android:contentDescription="@string/manage_windows_text" android:text="@string/manage_windows_text" android:drawableStart="@drawable/desktop_mode_ic_handle_menu_manage_windows" - android:drawableTint="?androidprv:attr/materialColorOnSurface" + android:drawableTint="@androidprv:color/materialColorOnSurface" style="@style/DesktopModeHandleMenuActionButton" /> <Button @@ -163,7 +163,7 @@ android:contentDescription="@string/change_aspect_ratio_text" android:text="@string/change_aspect_ratio_text" android:drawableStart="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio" - android:drawableTint="?androidprv:attr/materialColorOnSurface" + android:drawableTint="@androidprv:color/materialColorOnSurface" style="@style/DesktopModeHandleMenuActionButton" /> </LinearLayout> @@ -183,7 +183,7 @@ android:contentDescription="@string/open_in_browser_text" android:text="@string/open_in_browser_text" android:drawableStart="@drawable/desktop_mode_ic_handle_menu_open_in_browser" - android:drawableTint="?androidprv:attr/materialColorOnSurface" + android:drawableTint="@androidprv:color/materialColorOnSurface" style="@style/DesktopModeHandleMenuActionButton"/> <ImageButton @@ -195,7 +195,7 @@ android:layout_marginStart="10dp" android:contentDescription="@string/open_by_default_settings_text" android:src="@drawable/desktop_mode_ic_handle_menu_open_by_default_settings" - android:tint="?androidprv:attr/materialColorOnSurface"/> + android:tint="@androidprv:color/materialColorOnSurface"/> </LinearLayout> </LinearLayout> diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml index 375968ab0ad2..8d7e5fd95957 100644 --- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml +++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml @@ -58,7 +58,7 @@ android:fontFamily="google-sans-text" android:importantForAccessibility="no" android:text="@string/desktop_mode_maximize_menu_immersive_button_text" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:alpha="0"/> </LinearLayout> @@ -89,7 +89,7 @@ android:fontFamily="google-sans-text" android:importantForAccessibility="no" android:text="@string/desktop_mode_maximize_menu_maximize_text" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:alpha="0"/> </LinearLayout> @@ -140,7 +140,7 @@ android:importantForAccessibility="no" android:fontFamily="google-sans-text" android:text="@string/desktop_mode_maximize_menu_snap_text" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:alpha="0"/> </LinearLayout> </LinearLayout> diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml index bda087b143d0..0a44cd42e790 100644 --- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml +++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml @@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:lineSpacingExtra="4sp" android:textAlignment="center" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textSize="14sp"/> </LinearLayout>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml index 488123ad7b0c..cd36983aff2d 100644 --- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml +++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml @@ -64,7 +64,7 @@ android:lineSpacingExtra="4sp" android:text="@string/letterbox_education_dialog_title" android:textAlignment="center" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:fontFamily="@*android:string/config_headlineFontFamily" android:textSize="24sp"/> @@ -104,7 +104,7 @@ android:background= "@drawable/letterbox_education_dismiss_button_background_ripple" android:text="@string/letterbox_education_got_it" - android:textColor="?androidprv:attr/materialColorOnPrimary" + android:textColor="@androidprv:color/materialColorOnPrimary" android:textAlignment="center" android:contentDescription="@string/letterbox_education_got_it"/> diff --git a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml index b5bceda9a623..f6256e6bc5e7 100644 --- a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml +++ b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml @@ -64,7 +64,7 @@ android:lineHeight="32dp" android:textFontWeight="400" android:textSize="24sp" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" tools:text="Gmail" /> <TextView @@ -75,7 +75,7 @@ android:lineHeight="16dp" android:layout_gravity="center_horizontal" android:layout_marginBottom="16dp" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:text="@string/open_by_default_dialog_subheader_text"/> <RadioGroup @@ -121,7 +121,7 @@ android:layout_marginBottom="24dp" android:textSize="14sp" android:textFontWeight="500" - android:textColor="?androidprv:attr/materialColorOnPrimary" + android:textColor="@androidprv:color/materialColorOnPrimary" android:background="@drawable/open_by_default_settings_dialog_confirm_button_background"/> </LinearLayout> </ScrollView> diff --git a/libs/WindowManager/Shell/res/values/colors.xml b/libs/WindowManager/Shell/res/values/colors.xml index b7aa1581a5c1..d754243a2b07 100644 --- a/libs/WindowManager/Shell/res/values/colors.xml +++ b/libs/WindowManager/Shell/res/values/colors.xml @@ -43,7 +43,7 @@ <color name="compat_controls_text">@android:color/system_neutral1_50</color> <!-- Letterbox Education --> - <color name="letterbox_education_text_secondary">?androidprv:attr/materialColorSecondary</color> + <color name="letterbox_education_text_secondary">@androidprv:color/materialColorSecondary</color> <!-- Letterbox Dialog --> <color name="letterbox_dialog_background">@android:color/system_neutral1_900</color> diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml index 597a921302b7..8a4a7023b8e8 100644 --- a/libs/WindowManager/Shell/res/values/styles.xml +++ b/libs/WindowManager/Shell/res/values/styles.xml @@ -48,7 +48,7 @@ <item name="android:paddingEnd">0dp</item> <item name="android:textSize">14sp</item> <item name="android:textFontWeight">500</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:drawablePadding">16dp</item> <item name="android:background">?android:selectableItemBackground</item> </style> @@ -92,7 +92,7 @@ <style name="RestartDialogTitleText"> <item name="android:textSize">24sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:lineSpacingExtra">8sp</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> </style> @@ -104,23 +104,23 @@ <style name="RestartDialogBodyText" parent="RestartDialogBodyStyle"> <item name="android:letterSpacing">0.02</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> <item name="android:lineSpacingExtra">6sp</item> </style> <style name="RestartDialogCheckboxText" parent="RestartDialogBodyStyle"> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:lineSpacingExtra">6sp</item> </style> <style name="RestartDialogDismissButton" parent="RestartDialogBodyStyle"> <item name="android:lineSpacingExtra">2sp</item> - <item name="android:textColor">?androidprv:attr/materialColorPrimary</item> + <item name="android:textColor">@androidprv:color/materialColorPrimary</item> </style> <style name="RestartDialogConfirmButton" parent="RestartDialogBodyStyle"> <item name="android:lineSpacingExtra">2sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnPrimary</item> + <item name="android:textColor">@androidprv:color/materialColorOnPrimary</item> </style> <style name="ReachabilityEduHandLayout" parent="Theme.AppCompat.Light"> diff --git a/libs/WindowManager/Shell/shared/Android.bp b/libs/WindowManager/Shell/shared/Android.bp index 5113d980fb7d..c3ee0f76f550 100644 --- a/libs/WindowManager/Shell/shared/Android.bp +++ b/libs/WindowManager/Shell/shared/Android.bp @@ -71,6 +71,7 @@ java_library { srcs: [ "**/desktopmode/*.java", "**/desktopmode/*.kt", + ":wm_shell-shared-utils", ], static_libs: [ "com.android.window.flags.window-aconfig-java", diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java index 4c77eaf80a29..755f472ee22e 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java @@ -16,9 +16,15 @@ package com.android.wm.shell.shared.desktopmode; +import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED; + import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; +import android.hardware.display.DisplayManager; import android.os.SystemProperties; +import android.view.Display; +import android.view.WindowManager; import android.window.DesktopModeFlags; import com.android.internal.R; @@ -26,6 +32,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.window.flags.Flags; import java.io.PrintWriter; +import java.util.Arrays; /** * Constants for desktop mode feature @@ -35,6 +42,9 @@ public class DesktopModeStatus { private static final String TAG = "DesktopModeStatus"; + @Nullable + private static Boolean sIsLargeScreenDevice = null; + /** * Flag to indicate whether task resizing is veiled. */ @@ -227,13 +237,12 @@ public class DesktopModeStatus { * necessarily enabling desktop mode */ public static boolean overridesShowAppHandle(@NonNull Context context) { - return Flags.showAppHandleLargeScreens() - && context.getResources().getBoolean(R.bool.config_enableAppHandle); + return Flags.showAppHandleLargeScreens() && deviceHasLargeScreen(context); } /** * @return {@code true} if the app handle should be shown because desktop mode is enabled or - * the device is overriding {@code R.bool.config_enableAppHandle} + * the device has a large screen */ public static boolean canEnterDesktopModeOrShowAppHandle(@NonNull Context context) { return canEnterDesktopMode(context) || overridesShowAppHandle(context); @@ -276,6 +285,21 @@ public class DesktopModeStatus { } /** + * @return {@code true} if this device has an internal large screen + */ + private static boolean deviceHasLargeScreen(@NonNull Context context) { + if (sIsLargeScreenDevice == null) { + sIsLargeScreenDevice = Arrays.stream( + context.getSystemService(DisplayManager.class) + .getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) + .filter(display -> display.getType() == Display.TYPE_INTERNAL) + .anyMatch(display -> display.getMinSizeDimensionDp() + >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP); + } + return sIsLargeScreenDevice; + } + + /** * Return {@code true} if a display should enter desktop mode by default when the windowing mode * of the display's root [TaskDisplayArea] is set to WINDOWING_MODE_FREEFORM. */ @@ -315,6 +339,6 @@ public class DesktopModeStatus { pw.println(maxTaskLimitHandle == null ? "null" : maxTaskLimitHandle.getInt(/* def= */ -1)); pw.print(innerPrefix); pw.print("showAppHandle config override="); - pw.print(context.getResources().getBoolean(R.bool.config_enableAppHandle)); + pw.print(overridesShowAppHandle(context)); } } diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java index f9f43bc8dfae..b48296f5f76a 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java @@ -58,6 +58,11 @@ public class SplitScreenConstants { */ public static final int SPLIT_POSITION_BOTTOM_OR_RIGHT = 1; + /** + * Deprecated and will be replaced fully by @SplitIndex. With support for 3+ apps in split, + * existing references to top/left and bottom/right will be replaced by INDEX_0 and INDEX_1 + * respectively. For now they can be used interchangeably, the underlying ints are the same. + */ @IntDef(prefix = {"SPLIT_POSITION_"}, value = { SPLIT_POSITION_UNDEFINED, SPLIT_POSITION_TOP_OR_LEFT, @@ -85,6 +90,21 @@ public class SplitScreenConstants { public @interface SplitIndex { } + /** + * Return the @SplitIndex constant for a given integer index. @SplitIndex is the replacement + * for @SplitPosition, and will be used interchangeably with @SplitPosition to support 3+ apps + * in split. + */ + public static int getIndex(int i) { + return switch (i) { + case 0 -> SPLIT_INDEX_0; + case 1 -> SPLIT_INDEX_1; + case 2 -> SPLIT_INDEX_2; + case 3 -> SPLIT_INDEX_3; + default -> SPLIT_INDEX_UNDEFINED; + }; + } + /** Signifies that user is currently not in split screen. */ public static final int NOT_IN_SPLIT = -1; @@ -159,7 +179,8 @@ public class SplitScreenConstants { * {@link PersistentSnapPosition} + {@link #NOT_IN_SPLIT}. */ @IntDef(value = { - NOT_IN_SPLIT, + NOT_IN_SPLIT, // user is not in split screen + SNAP_TO_NONE, // in "free snap mode," where apps are fully resizable SNAP_TO_2_33_66, SNAP_TO_2_50_50, SNAP_TO_2_66_33, @@ -171,6 +192,23 @@ public class SplitScreenConstants { }) public @interface SplitScreenState {} + /** Converts a {@link SplitScreenState} to a human-readable string. */ + public static String stateToString(@SplitScreenState int state) { + return switch (state) { + case NOT_IN_SPLIT -> "NOT_IN_SPLIT"; + case SNAP_TO_NONE -> "SNAP_TO_NONE"; + case SNAP_TO_2_33_66 -> "SNAP_TO_2_33_66"; + case SNAP_TO_2_50_50 -> "SNAP_TO_2_50_50"; + case SNAP_TO_2_66_33 -> "SNAP_TO_2_66_33"; + case SNAP_TO_2_90_10 -> "SNAP_TO_2_90_10"; + case SNAP_TO_2_10_90 -> "SNAP_TO_2_10_90"; + case SNAP_TO_3_33_33_33 -> "SNAP_TO_3_33_33_33"; + case SNAP_TO_3_45_45_10 -> "SNAP_TO_3_45_45_10"; + case SNAP_TO_3_10_45_45 -> "SNAP_TO_3_10_45_45"; + default -> "UNKNOWN"; + }; + } + /** * Checks if the snapPosition in question is a {@link PersistentSnapPosition}. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt index 7243ea36b137..68c42d6a2648 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt @@ -18,6 +18,8 @@ package com.android.wm.shell.apptoweb +import android.app.assist.AssistContent +import android.app.assist.AssistContent.EXTRA_SESSION_TRANSFER_WEB_URI import android.content.Context import android.content.Intent import android.content.Intent.ACTION_VIEW @@ -102,3 +104,10 @@ fun getDomainVerificationUserState( return null } } + +/** + * Returns the web uri from the given [AssistContent]. + */ +fun AssistContent.getSessionWebUri(): Uri? { + return extras.getParcelable(EXTRA_SESSION_TRANSFER_WEB_URI) ?: webUri +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt index a727b54b3a3f..4cc81a9e6f8f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt @@ -17,7 +17,6 @@ package com.android.wm.shell.apptoweb import android.app.ActivityManager.RunningTaskInfo -import android.app.TaskInfo import android.content.Context import android.content.pm.verify.domain.DomainVerificationManager import android.graphics.Bitmap @@ -36,8 +35,17 @@ import android.widget.TextView import android.window.TaskConstants import com.android.wm.shell.R import com.android.wm.shell.common.DisplayController +import com.android.wm.shell.shared.annotations.ShellBackgroundThread +import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader import java.util.function.Supplier +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.MainCoroutineDispatcher +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** @@ -45,13 +53,14 @@ import java.util.function.Supplier */ internal class OpenByDefaultDialog( private val context: Context, - private val taskInfo: TaskInfo, + private val taskInfo: RunningTaskInfo, private val taskSurface: SurfaceControl, private val displayController: DisplayController, + private val taskResourceLoader: WindowDecorTaskResourceLoader, private val surfaceControlTransactionSupplier: Supplier<SurfaceControl.Transaction>, + @ShellMainThread private val mainDispatcher: MainCoroutineDispatcher, + @ShellBackgroundThread private val bgScope: CoroutineScope, private val listener: DialogLifecycleListener, - appIconBitmap: Bitmap?, - appName: CharSequence? ) { private lateinit var dialog: OpenByDefaultDialogView private lateinit var viewHost: SurfaceControlViewHost @@ -67,11 +76,20 @@ internal class OpenByDefaultDialog( context.getSystemService(DomainVerificationManager::class.java)!! private val packageName = taskInfo.baseActivity?.packageName!! + private var loadAppInfoJob: Job? = null init { createDialog() initializeRadioButtons() - bindAppInfo(appIconBitmap, appName) + loadAppInfoJob = bgScope.launch { + if (!isActive) return@launch + val name = taskResourceLoader.getName(taskInfo) + val icon = taskResourceLoader.getHeaderIcon(taskInfo) + withContext(mainDispatcher.immediate) { + if (!isActive) return@withContext + bindAppInfo(icon, name) + } + } } /** Creates an open by default settings dialog. */ @@ -147,14 +165,15 @@ internal class OpenByDefaultDialog( } private fun closeMenu() { + loadAppInfoJob?.cancel() dialogContainer?.releaseView() dialogContainer = null listener.onDialogDismissed() } private fun bindAppInfo( - appIconBitmap: Bitmap?, - appName: CharSequence? + appIconBitmap: Bitmap, + appName: CharSequence ) { appIconView.setImageBitmap(appIconBitmap) appNameView.text = appName diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index 60a52a808a54..56efdb885512 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -1314,7 +1314,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } } - if (handlePrepareTransition(info, st, ft, finishCallback)) { + if (handlePrepareTransition(transition, info, st, ft, finishCallback)) { if (checkTakeoverFlags()) { mTakeoverHandler = mTransitions.getHandlerForTakeover(transition, info); } @@ -1630,7 +1630,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont * happen when core make an activity become visible. */ @VisibleForTesting - boolean handlePrepareTransition( + boolean handlePrepareTransition(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction st, @NonNull SurfaceControl.Transaction ft, @@ -1678,6 +1678,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } } st.apply(); + // In case other transition handler took the handleRequest before this class. + mPrepareOpenTransition = transition; mFinishOpenTransaction = ft; mFinishOpenTransitionCallback = finishCallback; mOpenTransitionInfo = info; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java index 52955267a501..47032fd8616f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java @@ -38,7 +38,6 @@ import android.content.Intent; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; -import android.graphics.Color; import android.graphics.CornerPathEffect; import android.graphics.Outline; import android.graphics.Paint; @@ -543,15 +542,15 @@ public class BubbleExpandedView extends LinearLayout { void applyThemeAttrs() { final TypedArray ta = mContext.obtainStyledAttributes(new int[]{ - android.R.attr.dialogCornerRadius, - com.android.internal.R.attr.materialColorSurfaceBright, - com.android.internal.R.attr.materialColorSurfaceContainerHigh}); + android.R.attr.dialogCornerRadius}); boolean supportsRoundedCorners = ScreenDecorationsUtils.supportsRoundedCornersOnWindows( mContext.getResources()); mCornerRadius = supportsRoundedCorners ? ta.getDimensionPixelSize(0, 0) : 0; - mBackgroundColorFloating = ta.getColor(1, Color.WHITE); + mBackgroundColorFloating = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceBright); mExpandedViewContainer.setBackgroundColor(mBackgroundColorFloating); - final int manageMenuBg = ta.getColor(2, Color.WHITE); + final int manageMenuBg = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceContainerHigh); ta.recycle(); if (mManageButton != null) { mManageButton.getBackground().setColorFilter(manageMenuBg, PorterDuff.Mode.SRC_IN); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java index 1711dca4a8a3..da6948d947d8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java @@ -28,7 +28,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Outline; import android.graphics.Paint; @@ -209,7 +208,7 @@ public class BubbleFlyoutView extends FrameLayout { mPointerSize, mPointerSize, false /* isPointingLeft */)); mRightTriangleShape.setBounds(0, 0, mPointerSize, mPointerSize); - applyConfigurationColors(getResources().getConfiguration()); + applyConfigurationColors(); } @Override @@ -440,29 +439,23 @@ public class BubbleFlyoutView extends FrameLayout { boolean flagsChanged = nightModeFlags != mNightModeFlags; if (flagsChanged) { mNightModeFlags = nightModeFlags; - applyConfigurationColors(configuration); + applyConfigurationColors(); } return flagsChanged; } - private void applyConfigurationColors(Configuration configuration) { - int nightModeFlags = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; - boolean isNightModeOn = nightModeFlags == Configuration.UI_MODE_NIGHT_YES; - try (TypedArray ta = mContext.obtainStyledAttributes( - new int[]{ - com.android.internal.R.attr.materialColorSurfaceContainer, - com.android.internal.R.attr.materialColorOnSurface, - com.android.internal.R.attr.materialColorOnSurfaceVariant})) { - mFloatingBackgroundColor = ta.getColor(0, - isNightModeOn ? Color.BLACK : Color.WHITE); - mSenderText.setTextColor(ta.getColor(1, - isNightModeOn ? Color.WHITE : Color.BLACK)); - mMessageText.setTextColor(ta.getColor(2, - isNightModeOn ? Color.WHITE : Color.BLACK)); - mBgPaint.setColor(mFloatingBackgroundColor); - mLeftTriangleShape.getPaint().setColor(mFloatingBackgroundColor); - mRightTriangleShape.getPaint().setColor(mFloatingBackgroundColor); - } + private void applyConfigurationColors() { + mFloatingBackgroundColor = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceContainer); + mSenderText.setTextColor( + mContext.getColor(com.android.internal.R.color.materialColorOnSurface)); + mMessageText.setTextColor( + mContext.getColor(com.android.internal.R.color.materialColorOnSurfaceVariant)); + + mBgPaint.setColor(mFloatingBackgroundColor); + mLeftTriangleShape.getPaint().setColor(mFloatingBackgroundColor); + mRightTriangleShape.getPaint().setColor(mFloatingBackgroundColor); + } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt index c74412b825d9..862906a11424 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt @@ -19,7 +19,6 @@ package com.android.wm.shell.bubbles import android.app.ActivityTaskManager.INVALID_TASK_ID import android.content.Context import android.graphics.Bitmap -import android.graphics.Color import android.graphics.Matrix import android.graphics.Path import android.graphics.drawable.AdaptiveIconDrawable @@ -117,18 +116,8 @@ class BubbleOverflow(private val context: Context, private val positioner: Bubbl val res = context.resources // Set overflow button accent color, dot color - - val typedArray = - context.obtainStyledAttributes( - intArrayOf( - com.android.internal.R.attr.materialColorPrimaryFixed, - com.android.internal.R.attr.materialColorOnPrimaryFixed - ) - ) - - val colorAccent = typedArray.getColor(0, Color.WHITE) - val shapeColor = typedArray.getColor(1, Color.BLACK) - typedArray.recycle() + val colorAccent = context.getColor(com.android.internal.R.color.materialColorPrimaryFixed) + val shapeColor = context.getColor(com.android.internal.R.color.materialColorOnPrimaryFixed) dotColor = colorAccent overflowBtn?.iconDrawable?.setTint(shapeColor) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java index bf98ef82b475..64f54b8ab5be 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java @@ -226,13 +226,11 @@ public class BubbleOverflowContainerView extends LinearLayout { ? res.getColor(R.color.bubbles_dark) : res.getColor(R.color.bubbles_light)); - final TypedArray typedArray = getContext().obtainStyledAttributes(new int[] { - com.android.internal.R.attr.materialColorSurfaceBright, - com.android.internal.R.attr.materialColorOnSurface}); - int bgColor = typedArray.getColor(0, isNightMode ? Color.BLACK : Color.WHITE); - int textColor = typedArray.getColor(1, isNightMode ? Color.WHITE : Color.BLACK); - textColor = ContrastColorUtil.ensureTextContrast(textColor, bgColor, isNightMode); - typedArray.recycle(); + + int bgColor = getContext().getColor( + com.android.internal.R.color.materialColorSurfaceBright); + int textColor = getContext().getColor(com.android.internal.R.color.materialColorOnSurface); + setBackgroundColor(bgColor); mEmptyStateTitle.setTextColor(textColor); mEmptyStateSubtitle.setTextColor(textColor); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt index 9b3054e9ee13..a65466f71861 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt @@ -15,7 +15,6 @@ */ package com.android.wm.shell.bubbles -import android.graphics.Color import com.android.wm.shell.R import com.android.wm.shell.shared.bubbles.BubblePopupDrawable import com.android.wm.shell.shared.bubbles.BubblePopupView @@ -27,7 +26,6 @@ fun BubblePopupView.setup() { val attrs = context.obtainStyledAttributes( intArrayOf( - com.android.internal.R.attr.materialColorSurfaceContainer, android.R.attr.dialogCornerRadius ) ) @@ -35,8 +33,8 @@ fun BubblePopupView.setup() { val res = context.resources val config = BubblePopupDrawable.Config( - color = attrs.getColor(0, Color.WHITE), - cornerRadius = attrs.getDimension(1, 0f), + color = context.getColor(com.android.internal.R.color.materialColorSurfaceContainer), + cornerRadius = attrs.getDimension(0, 0f), contentPadding = res.getDimensionPixelSize(R.dimen.bubble_popup_padding), arrowWidth = res.getDimension(R.dimen.bubble_popup_arrow_width), arrowHeight = res.getDimension(R.dimen.bubble_popup_arrow_height), diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index 88f55b8af8f7..249a218d5e56 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java @@ -40,7 +40,6 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.Color; import android.graphics.Outline; import android.graphics.PointF; import android.graphics.PorterDuff; @@ -1326,10 +1325,9 @@ public class BubbleStackView extends FrameLayout R.layout.bubble_manage_menu, this, false); mManageMenu.setVisibility(View.INVISIBLE); - final TypedArray ta = mContext.obtainStyledAttributes(new int[]{ - com.android.internal.R.attr.materialColorSurfaceBright}); - final int menuBackgroundColor = ta.getColor(0, Color.WHITE); - ta.recycle(); + final int menuBackgroundColor = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceBright); + mManageMenu.getBackground().setColorFilter(menuBackgroundColor, PorterDuff.Mode.SRC_IN); PhysicsAnimator.getInstance(mManageMenu).setDefaultSpringConfig(mManageSpringConfig); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java index 1c71ef415eae..6c14d83dfafa 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java @@ -17,7 +17,6 @@ package com.android.wm.shell.bubbles.bar; import android.annotation.ColorInt; import android.content.Context; -import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.Icon; import android.util.AttributeSet; @@ -63,9 +62,8 @@ public class BubbleBarMenuItemView extends LinearLayout { */ void update(Icon icon, String title, @ColorInt int tint) { if (tint == Color.TRANSPARENT) { - final TypedArray typedArray = getContext().obtainStyledAttributes( - new int[]{com.android.internal.R.attr.materialColorOnSurface}); - mTextView.setTextColor(typedArray.getColor(0, Color.BLACK)); + mTextView.setTextColor( + getContext().getColor(com.android.internal.R.color.materialColorOnSurface)); } else { icon.setTint(tint); mTextView.setTextColor(tint); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java index 99e20097e61c..dfbf655bb6fc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java @@ -18,7 +18,6 @@ package com.android.wm.shell.bubbles.bar; import android.annotation.ColorInt; import android.content.Context; import android.content.res.ColorStateList; -import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.Icon; import android.util.AttributeSet; @@ -91,14 +90,11 @@ public class BubbleBarMenuView extends LinearLayout { } private void updateThemeColors() { - try (TypedArray ta = mContext.obtainStyledAttributes(new int[]{ - com.android.internal.R.attr.materialColorSurfaceBright, - com.android.internal.R.attr.materialColorOnSurface - })) { - mActionsSectionView.getBackground().setTint(ta.getColor(0, Color.WHITE)); - ImageViewCompat.setImageTintList(mBubbleDismissIconView, - ColorStateList.valueOf(ta.getColor(1, Color.BLACK))); - } + mActionsSectionView.getBackground().setTint( + mContext.getColor(com.android.internal.R.color.materialColorSurfaceBright)); + ImageViewCompat.setImageTintList(mBubbleDismissIconView, + ColorStateList.valueOf( + mContext.getColor(com.android.internal.R.color.materialColorOnSurface))); } /** Animates the menu from the specified start scale. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java index 9dd0cae20370..5f437d4af40f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java @@ -22,8 +22,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Color; import android.graphics.drawable.Icon; import android.view.LayoutInflater; import android.view.View; @@ -169,12 +167,7 @@ class BubbleBarMenuViewController { int handleHeight = mHandleView.getHandleHeight(); float targetWidth = mHandleView.getHandleWidth() + widthDiff * WIDTH_SWAP_FRACTION; float targetHeight = targetWidth * mMenuView.getTitleItemHeight() / mMenuView.getWidth(); - int menuColor; - try (TypedArray ta = mContext.obtainStyledAttributes(new int[]{ - com.android.internal.R.attr.materialColorSurfaceBright, - })) { - menuColor = ta.getColor(0, Color.WHITE); - } + int menuColor = mContext.getColor(com.android.internal.R.color.materialColorSurfaceBright); // Calculating deltas float swapScale = targetWidth / mMenuView.getWidth(); float handleWidthDelta = targetWidth - mHandleView.getHandleWidth(); @@ -227,11 +220,8 @@ class BubbleBarMenuViewController { private ArrayList<BubbleBarMenuView.MenuAction> createMenuActions(Bubble bubble) { ArrayList<BubbleBarMenuView.MenuAction> menuActions = new ArrayList<>(); Resources resources = mContext.getResources(); - int tintColor; - try (TypedArray ta = mContext.obtainStyledAttributes(new int[]{ - com.android.internal.R.attr.materialColorOnSurface})) { - tintColor = ta.getColor(0, Color.TRANSPARENT); - } + int tintColor = mContext.getColor(com.android.internal.R.color.materialColorOnSurface); + if (bubble.isConversation()) { // Don't bubble conversation action menuActions.add(new BubbleBarMenuView.MenuAction( diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java index ec3c0b83fe2d..c74bf53268f9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java @@ -338,6 +338,11 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged // Make mImeSourceControl point to the new control before starting the animation. if (hadImeSourceControl && mImeSourceControl != imeSourceControl) { mImeSourceControl.release(SurfaceControl::release); + if (android.view.inputmethod.Flags.refactorInsetsController() + && !hasImeLeash && mAnimation != null) { + // In case of losing the leash, the animation should be cancelled. + mAnimation.cancel(); + } } mImeSourceControl = imeSourceControl; @@ -414,9 +419,14 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged // already (e.g., when focussing an editText in activity B, while and editText in // activity A is focussed), we will not get a call of #insetsControlChanged, and // therefore have to start the show animation from here - startAnimation(mImeRequestedVisible /* show */, false /* forceRestart */); - - setVisibleDirectly(mImeRequestedVisible || mAnimation != null, statsToken); + startAnimation(mImeRequestedVisible /* show */, false /* forceRestart */, + statsToken); + + // In case of a hide, the statsToken should not been send yet (as the animation + // is still ongoing). It will be sent at the end of the animation + boolean hideAnimOngoing = !mImeRequestedVisible && mAnimation != null; + setVisibleDirectly(mImeRequestedVisible || mAnimation != null, + hideAnimOngoing ? null : statsToken); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt index 193c593e2ab2..2c4df0c0ca49 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt @@ -25,7 +25,6 @@ import com.android.wm.shell.common.ShellExecutor class PipAppOpsListener( private val mContext: Context, - private val mCallback: Callback, private val mMainExecutor: ShellExecutor ) { private val mAppOpsManager: AppOpsManager = checkNotNull( @@ -46,7 +45,9 @@ class PipAppOpsListener( packageName ) != AppOpsManager.MODE_ALLOWED ) { - mMainExecutor.execute { mCallback.dismissPip() } + mCallback?.let { + mMainExecutor.execute { it.dismissPip() } + } } } catch (e: PackageManager.NameNotFoundException) { // Unregister the listener if the package can't be found @@ -54,6 +55,12 @@ class PipAppOpsListener( } } + private var mCallback: Callback? = null + + fun setCallback(callback: Callback) { + mCallback = callback + } + fun onActivityPinned(packageName: String) { // Register for changes to the app ops setting for this package while it is in PiP registerAppOpsListener(packageName) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java index 813772f20a8a..2f5afcaa907b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java @@ -352,8 +352,8 @@ public class DividerSnapAlgorithm { ? mPinnedTaskbarInsets.right : mPinnedTaskbarInsets.bottom; float ratio = areOffscreenRatiosSupported() - ? SplitLayout.OFFSCREEN_ASYMMETRIC_RATIO - : SplitLayout.ONSCREEN_ONLY_ASYMMETRIC_RATIO; + ? SplitSpec.OFFSCREEN_ASYMMETRIC_RATIO + : SplitSpec.ONSCREEN_ONLY_ASYMMETRIC_RATIO; int size = (int) (ratio * (end - start)) - mDividerSize / 2; int leftTopPosition = start + pinnedTaskbarShiftStart + size; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java index d20ad5d1b908..9fb36b36ff29 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java @@ -33,12 +33,14 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.app.ActivityManager; import android.content.Context; +import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Binder; +import android.os.Trace; import android.view.IWindow; import android.view.LayoutInflater; import android.view.SurfaceControl; @@ -50,10 +52,12 @@ import android.widget.FrameLayout; import android.widget.ImageView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.R; import com.android.wm.shell.common.ScreenshotUtils; +import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SurfaceUtils; import java.util.function.Consumer; @@ -79,9 +83,19 @@ public class SplitDecorManager extends WindowlessWindowManager { private static final String RESIZING_BACKGROUND_SURFACE_NAME = "ResizingBackground"; private static final String GAP_BACKGROUND_SURFACE_NAME = "GapBackground"; + // Indicates the loading state of mIcon + enum IconLoadState { + NOT_LOADED, + LOADING, + LOADED + } + private final IconProvider mIconProvider; + private final ShellExecutor mMainExecutor; + private final ShellExecutor mBgExecutor; private Drawable mIcon; + private IconLoadState mIconLoadState = IconLoadState.NOT_LOADED; private ImageView mVeilIconView; private SurfaceControlViewHost mViewHost; /** The parent surface that this is attached to. Should be the stage root. */ @@ -109,9 +123,14 @@ public class SplitDecorManager extends WindowlessWindowManager { private int mOffsetY; private int mRunningAnimationCount = 0; - public SplitDecorManager(Configuration configuration, IconProvider iconProvider) { + public SplitDecorManager(Configuration configuration, + IconProvider iconProvider, + ShellExecutor mainExecutor, + ShellExecutor bgExecutor) { super(configuration, null /* rootSurface */, null /* hostInputToken */); mIconProvider = iconProvider; + mMainExecutor = mainExecutor; + mBgExecutor = bgExecutor; } @Override @@ -199,6 +218,7 @@ public class SplitDecorManager extends WindowlessWindowManager { } mHostLeash = null; mIcon = null; + mIconLoadState = IconLoadState.NOT_LOADED; mVeilIconView = null; mIsCurrentlyChanging = false; mShown = false; @@ -260,10 +280,11 @@ public class SplitDecorManager extends WindowlessWindowManager { .setWindowCrop(mGapBackgroundLeash, sideBounds.width(), sideBounds.height()); } - if (mIcon == null && resizingTask.topActivityInfo != null) { - mIcon = mIconProvider.getIcon(resizingTask.topActivityInfo); - mVeilIconView.setImageDrawable(mIcon); - mVeilIconView.setVisibility(View.VISIBLE); + if (mIconLoadState == IconLoadState.NOT_LOADED && resizingTask.topActivityInfo != null) { + loadIconInBackground(resizingTask.topActivityInfo, () -> { + mVeilIconView.setImageDrawable(mIcon); + mVeilIconView.setVisibility(View.VISIBLE); + }); WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mViewHost.getView().getLayoutParams(); @@ -417,10 +438,10 @@ public class SplitDecorManager extends WindowlessWindowManager { } if (mIcon == null && resizingTask.topActivityInfo != null) { - // Initialize icon - mIcon = mIconProvider.getIcon(resizingTask.topActivityInfo); - mVeilIconView.setImageDrawable(mIcon); - mVeilIconView.setVisibility(View.VISIBLE); + loadIconInBackground(resizingTask.topActivityInfo, () -> { + mVeilIconView.setImageDrawable(mIcon); + mVeilIconView.setVisibility(View.VISIBLE); + }); WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mViewHost.getView().getLayoutParams(); @@ -453,7 +474,7 @@ public class SplitDecorManager extends WindowlessWindowManager { return; } - // Recenter icon + // Re-center icon t.setPosition(mIconLeash, mInstantaneousBounds.width() / 2f - mIconSize / 2f, mInstantaneousBounds.height() / 2f - mIconSize / 2f); @@ -596,9 +617,38 @@ public class SplitDecorManager extends WindowlessWindowManager { mVeilIconView.setImageDrawable(null); t.hide(mIconLeash); mIcon = null; + mIconLoadState = IconLoadState.NOT_LOADED; } } + /** + * Loads the icon for the given {@param info}, calling {@param postLoadCb} on the main thread + * if provided. + */ + private void loadIconInBackground(@NonNull ActivityInfo info, @Nullable Runnable postLoadCb) { + mIconLoadState = IconLoadState.LOADING; + mBgExecutor.setBoost(); + mBgExecutor.execute(() -> { + Trace.beginSection("SplitDecorManager.loadIconInBackground(" + + info.applicationInfo.packageName + ")"); + final Drawable icon = mIconProvider.getIcon(info); + Trace.endSection(); + mMainExecutor.execute(() -> { + if (mIconLoadState != IconLoadState.LOADING) { + // The request was canceled while loading in the background, just drop the + // result + return; + } + mIcon = icon; + mIconLoadState = IconLoadState.LOADED; + if (postLoadCb != null) { + postLoadCb.run(); + } + }); + mBgExecutor.resetBoost(); + }); + } + private static float[] getResizingBackgroundColor(ActivityManager.RunningTaskInfo taskInfo) { final int taskBgColor = taskInfo.taskDescription.getBackgroundColor(); return Color.valueOf(taskBgColor == -1 ? Color.WHITE : taskBgColor).getComponents(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java index 1852cda7e804..21c44c9b92ee 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java @@ -112,11 +112,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange private static final int FLING_EXIT_DURATION = 450; private static final int FLING_OFFSCREEN_DURATION = 500; - /** A split ratio used on larger screens, where we can fit both apps onscreen. */ - public static final float ONSCREEN_ONLY_ASYMMETRIC_RATIO = 0.33f; - /** A split ratio used on smaller screens, where we place one app mostly offscreen. */ - public static final float OFFSCREEN_ASYMMETRIC_RATIO = 0.1f; - // Here are some (arbitrarily decided) layer definitions used during animations to make sure the // layers stay in order. (During transitions, everything is reparented onto a transition root // and can be freely relayered.) @@ -236,7 +231,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange updateDividerConfig(mContext); mRootBounds.set(configuration.windowConfiguration.getBounds()); - mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); + updateLayouts(); mInteractionJankMonitor = InteractionJankMonitor.getInstance(); resetDividerPosition(); updateInvisibleRect(); @@ -490,7 +485,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mIsLargeScreen = configuration.smallestScreenWidthDp >= 600; mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait, configuration); - mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); + updateLayouts(); updateDividerConfig(mContext); initDividerPosition(mTempRect, wasLeftRightSplit); updateInvisibleRect(); @@ -518,7 +513,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mRootBounds.set(tmpRect); mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait, mIsLargeScreen, mRootBounds.width() >= mRootBounds.height()); - mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); + updateLayouts(); initDividerPosition(mTempRect, wasLeftRightSplit); } @@ -652,7 +647,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange if (!mPinnedTaskbarInsets.equals(pinnedTaskbarInsets)) { mPinnedTaskbarInsets = pinnedTaskbarInsets; // Refresh the DividerSnapAlgorithm. - mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); + updateLayouts(); // If the divider is no longer placed on a snap point, animate it to the nearest one. DividerSnapAlgorithm.SnapTarget snapTarget = findSnapTarget(mDividerPosition, 0, false /* hardDismiss */); @@ -799,6 +794,10 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } void onStartDragging() { + // This triggers initialization of things like the resize veil in preparation for + // showing it when the user moves the divider past the slop + updateDividerBounds(getDividerPosition(), false /* shouldUseParallaxEffect */); + mInteractionJankMonitor.begin(getDividerLeash(), mContext, mHandler, CUJ_SPLIT_SCREEN_RESIZE); } @@ -824,8 +823,22 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange return mDividerSnapAlgorithm.calculateSnapTarget(position, velocity, hardDismiss); } - private DividerSnapAlgorithm getSnapAlgorithm(Context context, Rect rootBounds) { - final Rect insets = getDisplayStableInsets(context); + /** + * (Re)calculates the split screen logic for this particular display/orientation. Refreshes the + * DividerSnapAlgorithm, which controls divider snap points, and populates a map in SplitState + * with bounds for all valid split layouts. + */ + private void updateLayouts() { + // Update SplitState map + + if (Flags.enableFlexibleTwoAppSplit()) { + mSplitState.populateLayouts( + mRootBounds, mDividerSize, mIsLeftRightSplit, mPinnedTaskbarInsets.toRect()); + } + + // Get new DividerSnapAlgorithm + + final Rect insets = getDisplayStableInsets(mContext); // Make split axis insets value same as the larger one to avoid bounds1 and bounds2 // have difference for avoiding size-compat mode when switching unresizable apps in @@ -835,10 +848,10 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange insets.set(insets.left, largerInsets, insets.right, largerInsets); } - return new DividerSnapAlgorithm( - context.getResources(), - rootBounds.width(), - rootBounds.height(), + mDividerSnapAlgorithm = new DividerSnapAlgorithm( + mContext.getResources(), + mRootBounds.width(), + mRootBounds.height(), mDividerSize, mIsLeftRightSplit, insets, @@ -1560,7 +1573,9 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange final int imeTargetPosition = getImeTargetPosition(); mHasImeFocus = imeTargetPosition != SPLIT_POSITION_UNDEFINED; if (!mHasImeFocus) { - return 0; + if (!android.view.inputmethod.Flags.refactorInsetsController() || showing) { + return 0; + } } mStartImeTop = showing ? hiddenTop : shownTop; @@ -1613,7 +1628,11 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange @Override public void onImePositionChanged(int displayId, int imeTop, SurfaceControl.Transaction t) { - if (displayId != mDisplayId || !mHasImeFocus) return; + if (displayId != mDisplayId || !mHasImeFocus) { + if (!android.view.inputmethod.Flags.refactorInsetsController() || mImeShown) { + return; + } + } onProgress(getProgress(imeTop)); mSplitLayoutHandler.onLayoutPositionChanging(SplitLayout.this); } @@ -1621,7 +1640,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange @Override public void onImeEndPositioning(int displayId, boolean cancel, SurfaceControl.Transaction t) { - if (displayId != mDisplayId || !mHasImeFocus || cancel) return; + if (displayId != mDisplayId || cancel) return; + if (!mHasImeFocus) { + if (!android.view.inputmethod.Flags.refactorInsetsController() || mImeShown) { + return; + } + } ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Split IME animation ending, canceled=%b", cancel); onProgress(1.0f); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitSpec.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitSpec.java new file mode 100644 index 000000000000..9c951bd89876 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitSpec.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.common.split; + +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_10_90; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_33_66; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_66_33; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_90_10; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_3_10_45_45; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_3_33_33_33; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_3_45_45_10; +import static com.android.wm.shell.shared.split.SplitScreenConstants.stateToString; + +import android.graphics.Rect; +import android.graphics.RectF; +import android.util.Log; + +import com.android.wm.shell.shared.split.SplitScreenConstants.SplitScreenState; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * A reference class that stores the split layouts available in this device/orientation. Layouts are + * available as lists of RectFs, where each RectF represents the bounds of an app. + */ +public class SplitSpec { + private static final String TAG = "SplitSpec"; + private static final boolean DEBUG = true; + + /** A split ratio used on larger screens, where we can fit both apps onscreen. */ + public static final float ONSCREEN_ONLY_ASYMMETRIC_RATIO = 0.33f; + /** A split ratio used on smaller screens, where we place one app mostly offscreen. */ + public static final float OFFSCREEN_ASYMMETRIC_RATIO = 0.1f; + /** A 50-50 split ratio. */ + public static final float MIDDLE_RATIO = 0.5f; + + private final boolean mIsLeftRightSplit; + /** The usable display area, considering insets that affect split bounds. */ + private final RectF mUsableArea; + /** Half the divider size. */ + private final float mHalfDiv; + + /** A large map that stores all valid split layouts. */ + private final Map<Integer, List<RectF>> mLayouts = new HashMap<>(); + + /** Constructor; initializes the layout map. */ + public SplitSpec(Rect displayBounds, int dividerSize, boolean isLeftRightSplit, + Rect pinnedTaskbarInsets) { + mIsLeftRightSplit = isLeftRightSplit; + mUsableArea = new RectF(displayBounds); + mUsableArea.left += pinnedTaskbarInsets.left; + mUsableArea.top += pinnedTaskbarInsets.top; + mUsableArea.right -= pinnedTaskbarInsets.right; + mUsableArea.bottom -= pinnedTaskbarInsets.bottom; + mHalfDiv = dividerSize / 2f; + + // The "start" position, considering insets. + float s = isLeftRightSplit ? mUsableArea.left : mUsableArea.top; + // The "end" position, considering insets. + float e = isLeftRightSplit ? mUsableArea.right : mUsableArea.bottom; + // The "length" of the usable display (width or height). Apps are arranged along this axis. + float l = e - s; + float divPos; + float divPos2; + + // SNAP_TO_2_10_90 + divPos = s + (l * OFFSCREEN_ASYMMETRIC_RATIO); + createAppLayout(SNAP_TO_2_10_90, divPos); + + // SNAP_TO_2_33_66 + divPos = s + (l * ONSCREEN_ONLY_ASYMMETRIC_RATIO); + createAppLayout(SNAP_TO_2_33_66, divPos); + + // SNAP_TO_2_50_50 + divPos = s + (l * MIDDLE_RATIO); + createAppLayout(SNAP_TO_2_50_50, divPos); + + // SNAP_TO_2_66_33 + divPos = s + (l * (1 - ONSCREEN_ONLY_ASYMMETRIC_RATIO)); + createAppLayout(SNAP_TO_2_66_33, divPos); + + // SNAP_TO_2_90_10 + divPos = s + (l * (1 - OFFSCREEN_ASYMMETRIC_RATIO)); + createAppLayout(SNAP_TO_2_90_10, divPos); + + // SNAP_TO_3_10_45_45 + divPos = s + (l * OFFSCREEN_ASYMMETRIC_RATIO); + divPos2 = e - ((l * (1 - OFFSCREEN_ASYMMETRIC_RATIO)) / 2f); + createAppLayout(SNAP_TO_3_10_45_45, divPos, divPos2); + + // SNAP_TO_3_33_33_33 + divPos = s + (l * ONSCREEN_ONLY_ASYMMETRIC_RATIO); + divPos2 = e - (l * ONSCREEN_ONLY_ASYMMETRIC_RATIO); + createAppLayout(SNAP_TO_3_33_33_33, divPos, divPos2); + + // SNAP_TO_3_45_45_10 + divPos = s + ((l * (1 - OFFSCREEN_ASYMMETRIC_RATIO)) / 2f); + divPos2 = e - (l * OFFSCREEN_ASYMMETRIC_RATIO); + createAppLayout(SNAP_TO_3_45_45_10, divPos, divPos2); + + if (DEBUG) { + dump(); + } + } + + /** + * Creates a two-app layout and enters it into the layout map. + * @param divPos The position of the divider. + */ + private void createAppLayout(@SplitScreenState int state, float divPos) { + List<RectF> list = new ArrayList<>(); + RectF rect1 = new RectF(mUsableArea); + RectF rect2 = new RectF(mUsableArea); + if (mIsLeftRightSplit) { + rect1.right = divPos - mHalfDiv; + rect2.left = divPos + mHalfDiv; + } else { + rect1.top = divPos - mHalfDiv; + rect2.bottom = divPos + mHalfDiv; + } + list.add(rect1); + list.add(rect2); + mLayouts.put(state, list); + } + + /** + * Creates a three-app layout and enters it into the layout map. + * @param divPos1 The position of the first divider. + * @param divPos2 The position of the second divider. + */ + private void createAppLayout(@SplitScreenState int state, float divPos1, float divPos2) { + List<RectF> list = new ArrayList<>(); + RectF rect1 = new RectF(mUsableArea); + RectF rect2 = new RectF(mUsableArea); + RectF rect3 = new RectF(mUsableArea); + if (mIsLeftRightSplit) { + rect1.right = divPos1 - mHalfDiv; + rect2.left = divPos1 + mHalfDiv; + rect2.right = divPos2 - mHalfDiv; + rect3.left = divPos2 + mHalfDiv; + } else { + rect1.right = divPos1 - mHalfDiv; + rect2.left = divPos1 + mHalfDiv; + rect3.right = divPos2 - mHalfDiv; + rect3.left = divPos2 + mHalfDiv; + } + list.add(rect1); + list.add(rect2); + list.add(rect3); + mLayouts.put(state, list); + } + + /** Logs all calculated layouts */ + private void dump() { + mLayouts.forEach((k, v) -> { + Log.d(TAG, stateToString(k)); + v.forEach(rect -> Log.d(TAG, " - " + rect.toShortString())); + }); + } + + /** Returns the layout associated with a given split state. */ + List<RectF> getSpec(@SplitScreenState int state) { + return mLayouts.get(state); + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java index 71758e0d2159..d1d133d16ae4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java @@ -19,11 +19,17 @@ package com.android.wm.shell.common.split; import static com.android.wm.shell.shared.split.SplitScreenConstants.NOT_IN_SPLIT; import static com.android.wm.shell.shared.split.SplitScreenConstants.SplitScreenState; +import android.graphics.Rect; +import android.graphics.RectF; + +import java.util.List; + /** * A class that manages the "state" of split screen. See {@link SplitScreenState} for definitions. */ public class SplitState { private @SplitScreenState int mState = NOT_IN_SPLIT; + private SplitSpec mSplitSpec; /** Updates the current state of split screen on this device. */ public void set(@SplitScreenState int newState) { @@ -39,4 +45,16 @@ public class SplitState { public void exit() { set(NOT_IN_SPLIT); } + + /** Refresh the valid layouts for this display/orientation. */ + public void populateLayouts(Rect displayBounds, int dividerSize, boolean isLeftRightSplit, + Rect pinnedTaskbarInsets) { + mSplitSpec = + new SplitSpec(displayBounds, dividerSize, isLeftRightSplit, pinnedTaskbarInsets); + } + + /** Returns the layout associated with a given split state. */ + public List<RectF> getLayout(@SplitScreenState int state) { + return mSplitSpec.getSpec(state); + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java index 9d4b4bbb33de..fe6066c8c4fb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java @@ -55,6 +55,7 @@ import com.android.wm.shell.compatui.api.CompatUIHandler; import com.android.wm.shell.compatui.api.CompatUIInfo; import com.android.wm.shell.compatui.impl.CompatUIEvents.SizeCompatRestartButtonClicked; import com.android.wm.shell.desktopmode.DesktopUserRepositories; +import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.sysui.KeyguardChangeListener; import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; @@ -70,7 +71,6 @@ import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; -import java.util.function.IntPredicate; import java.util.function.Predicate; /** @@ -667,9 +667,10 @@ public class CompatUIController implements OnDisplaysChangedListener, private void createOrUpdateUserAspectRatioSettingsLayout(@NonNull TaskInfo taskInfo, @Nullable ShellTaskOrganizer.TaskListener taskListener) { + boolean overridesShowAppHandle = DesktopModeStatus.overridesShowAppHandle(mContext); if (mUserAspectRatioSettingsLayout != null) { if (mUserAspectRatioSettingsLayout.needsToBeRecreated(taskInfo, taskListener) - || mIsInDesktopMode) { + || mIsInDesktopMode || overridesShowAppHandle) { mUserAspectRatioSettingsLayout.release(); mUserAspectRatioSettingsLayout = null; } else { @@ -682,8 +683,9 @@ public class CompatUIController implements OnDisplaysChangedListener, return; } } - if (mIsInDesktopMode) { - // Return if in desktop mode. + if (mIsInDesktopMode || overridesShowAppHandle) { + // Return if in desktop mode or app handle menu is already showing change aspect ratio + // option. return; } // Create a new UI layout. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java index aebd94fc173a..5b6b897e55d9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java @@ -34,6 +34,7 @@ import com.android.wm.shell.common.split.SplitState; import com.android.wm.shell.dagger.pip.TvPipModule; import com.android.wm.shell.recents.RecentTasksController; import com.android.wm.shell.shared.TransactionPool; +import com.android.wm.shell.shared.annotations.ShellBackgroundThread; import com.android.wm.shell.shared.annotations.ShellMainThread; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.splitscreen.tv.TvSplitScreenController; @@ -93,11 +94,12 @@ public class TvWMShellModule { SplitState splitState, @ShellMainThread ShellExecutor mainExecutor, Handler mainHandler, + @ShellBackgroundThread ShellExecutor bgExecutor, SystemWindows systemWindows) { return new TvSplitScreenController(context, shellInit, shellCommandHandler, shellController, shellTaskOrganizer, syncQueue, rootTDAOrganizer, displayController, displayImeController, displayInsetsController, transitions, transactionPool, iconProvider, recentTasks, launchAdjacentController, multiInstanceHelper, - splitState, mainExecutor, mainHandler, systemWindows); + splitState, mainExecutor, mainHandler, bgExecutor, systemWindows); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index de86b22e0a99..6c805c87c08f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java @@ -64,6 +64,7 @@ import com.android.wm.shell.common.TabletopModeController; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.pip.PhonePipKeepClearAlgorithm; import com.android.wm.shell.common.pip.PhoneSizeSpecSource; +import com.android.wm.shell.common.pip.PipAppOpsListener; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDisplayLayoutState; @@ -531,6 +532,13 @@ public abstract class WMShellBaseModule { pipKeepClearAlgorithm, pipDisplayLayoutState, sizeSpecSource); } + @WMSingleton + @Provides + static PipAppOpsListener providePipAppOpsListener(Context context, + @ShellMainThread ShellExecutor mainExecutor) { + return new PipAppOpsListener(context, mainExecutor); + } + // // Bubbles (optional feature) // diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 0cd0f4a97bbf..ace7f078bb10 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -151,6 +151,7 @@ import com.android.wm.shell.windowdecor.CaptionWindowDecorViewModel; import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel; import com.android.wm.shell.windowdecor.WindowDecorViewModel; import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer; +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader; import com.android.wm.shell.windowdecor.common.viewhost.DefaultWindowDecorViewHostSupplier; import com.android.wm.shell.windowdecor.common.viewhost.PooledWindowDecorViewHostSupplier; import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost; @@ -517,7 +518,8 @@ public abstract class WMShellModule { MultiInstanceHelper multiInstanceHelper, SplitState splitState, @ShellMainThread ShellExecutor mainExecutor, - @ShellMainThread Handler mainHandler) { + @ShellMainThread Handler mainHandler, + @ShellBackgroundThread ShellExecutor bgExecutor) { return new SplitScreenController( context, shellInit, @@ -541,7 +543,8 @@ public abstract class WMShellModule { multiInstanceHelper, splitState, mainExecutor, - mainHandler); + mainHandler, + bgExecutor); } // @@ -767,6 +770,8 @@ public abstract class WMShellModule { @WMSingleton @Provides static DesktopTilingDecorViewModel provideDesktopTilingViewModel(Context context, + @ShellMainThread MainCoroutineDispatcher mainDispatcher, + @ShellBackgroundThread CoroutineScope bgScope, DisplayController displayController, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, SyncTransactionQueue syncQueue, @@ -775,9 +780,12 @@ public abstract class WMShellModule { ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler, ReturnToDragStartAnimator returnToDragStartAnimator, @DynamicOverride DesktopUserRepositories desktopUserRepositories, - DesktopModeEventLogger desktopModeEventLogger) { + DesktopModeEventLogger desktopModeEventLogger, + WindowDecorTaskResourceLoader windowDecorTaskResourceLoader) { return new DesktopTilingDecorViewModel( context, + mainDispatcher, + bgScope, displayController, rootTaskDisplayAreaOrganizer, syncQueue, @@ -786,7 +794,8 @@ public abstract class WMShellModule { toggleResizeDesktopTaskTransitionHandler, returnToDragStartAnimator, desktopUserRepositories, - desktopModeEventLogger + desktopModeEventLogger, + windowDecorTaskResourceLoader ); } @@ -903,6 +912,8 @@ public abstract class WMShellModule { @ShellMainThread ShellExecutor shellExecutor, @ShellMainThread Handler mainHandler, @ShellMainThread Choreographer mainChoreographer, + @ShellMainThread MainCoroutineDispatcher mainDispatcher, + @ShellBackgroundThread CoroutineScope bgScope, @ShellBackgroundThread ShellExecutor bgExecutor, ShellInit shellInit, ShellCommandHandler shellCommandHandler, @@ -929,13 +940,15 @@ public abstract class WMShellModule { Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler, FocusTransitionObserver focusTransitionObserver, DesktopModeEventLogger desktopModeEventLogger, - DesktopModeUiEventLogger desktopModeUiEventLogger + DesktopModeUiEventLogger desktopModeUiEventLogger, + WindowDecorTaskResourceLoader taskResourceLoader ) { if (!DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) { return Optional.empty(); } return Optional.of(new DesktopModeWindowDecorViewModel(context, shellExecutor, mainHandler, - mainChoreographer, bgExecutor, shellInit, shellCommandHandler, windowManager, + mainChoreographer, mainDispatcher, bgScope, bgExecutor, + shellInit, shellCommandHandler, windowManager, taskOrganizer, desktopUserRepositories, displayController, shellController, displayInsetsController, syncQueue, transitions, desktopTasksController, desktopImmersiveController.get(), @@ -943,7 +956,18 @@ public abstract class WMShellModule { assistContentRequester, windowDecorViewHostSupplier, multiInstanceHelper, desktopTasksLimiter, appHandleEducationController, appToWebEducationController, windowDecorCaptionHandleRepository, activityOrientationChangeHandler, - focusTransitionObserver, desktopModeEventLogger, desktopModeUiEventLogger)); + focusTransitionObserver, desktopModeEventLogger, desktopModeUiEventLogger, + taskResourceLoader)); + } + + @WMSingleton + @Provides + static WindowDecorTaskResourceLoader provideWindowDecorTaskResourceLoader( + @NonNull Context context, @NonNull ShellInit shellInit, + @NonNull ShellController shellController, + @NonNull ShellCommandHandler shellCommandHandler) { + return new WindowDecorTaskResourceLoader(context, shellInit, shellController, + shellCommandHandler); } @WMSingleton @@ -1025,12 +1049,14 @@ public abstract class WMShellModule { static DesktopUserRepositories provideDesktopUserRepositories( Context context, ShellInit shellInit, + ShellController shellController, DesktopPersistentRepository desktopPersistentRepository, DesktopRepositoryInitializer desktopRepositoryInitializer, @ShellMainThread CoroutineScope mainScope, UserManager userManager ) { - return new DesktopUserRepositories(context, shellInit, desktopPersistentRepository, + return new DesktopUserRepositories(context, shellInit, shellController, + desktopPersistentRepository, desktopRepositoryInitializer, mainScope, userManager); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java index cfdfe3d52011..64b6c0f8e75d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java @@ -203,14 +203,6 @@ public abstract class Pip1Module { @WMSingleton @Provides - static PipAppOpsListener providePipAppOpsListener(Context context, - PipTouchHandler pipTouchHandler, - @ShellMainThread ShellExecutor mainExecutor) { - return new PipAppOpsListener(context, pipTouchHandler.getMotionHelper(), mainExecutor); - } - - @WMSingleton - @Provides static PipMotionHelper providePipMotionHelper(Context context, @ShellMainThread ShellExecutor mainExecutor, PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java index 3a9961917f79..10054a1727fc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java @@ -28,6 +28,7 @@ import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.common.pip.PipAppOpsListener; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDisplayLayoutState; @@ -113,6 +114,7 @@ public abstract class Pip2Module { ShellTaskOrganizer shellTaskOrganizer, PipTransitionState pipTransitionState, PipTouchHandler pipTouchHandler, + PipAppOpsListener pipAppOpsListener, @ShellMainThread ShellExecutor mainExecutor) { if (!PipUtils.isPip2ExperimentEnabled()) { return Optional.empty(); @@ -121,7 +123,7 @@ public abstract class Pip2Module { context, shellInit, shellCommandHandler, shellController, displayController, displayInsetsController, pipBoundsState, pipBoundsAlgorithm, pipDisplayLayoutState, pipScheduler, taskStackListener, shellTaskOrganizer, - pipTransitionState, pipTouchHandler, mainExecutor)); + pipTransitionState, pipTouchHandler, pipAppOpsListener, mainExecutor)); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java index 78e676f8cd45..b9f548297189 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java @@ -233,12 +233,4 @@ public abstract class TvPipModule { static PipParamsChangedForwarder providePipParamsChangedForwarder() { return new PipParamsChangedForwarder(); } - - @WMSingleton - @Provides - static PipAppOpsListener providePipAppOpsListener(Context context, - PipTaskOrganizer pipTaskOrganizer, - @ShellMainThread ShellExecutor mainExecutor) { - return new PipAppOpsListener(context, pipTaskOrganizer::removePip, mainExecutor); - } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt index 8e2a412764eb..536dc2a58534 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt @@ -74,13 +74,11 @@ class DesktopImmersiveController( { SurfaceControl.Transaction() }, ) - @VisibleForTesting var state: TransitionState? = null - - @VisibleForTesting val pendingExternalExitTransitions = mutableListOf<ExternalPendingExit>() + @VisibleForTesting val pendingImmersiveTransitions = mutableListOf<PendingTransition>() /** Whether there is an immersive transition that hasn't completed yet. */ private val inProgress: Boolean - get() = state != null || pendingExternalExitTransitions.isNotEmpty() + get() = pendingImmersiveTransitions.isNotEmpty() private val rectEvaluator = RectEvaluator() @@ -101,20 +99,19 @@ class DesktopImmersiveController( if (inProgress) { logV( "Cannot start entry because transition(s) already in progress: %s", - getRunningTransitions(), + pendingImmersiveTransitions, ) return } val wct = WindowContainerTransaction().apply { setBounds(taskInfo.token, Rect()) } logV("Moving task ${taskInfo.taskId} into immersive mode") val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this) - state = - TransitionState( - transition = transition, - displayId = taskInfo.displayId, - taskId = taskInfo.taskId, - direction = Direction.ENTER, - ) + addPendingImmersiveTransition( + taskId = taskInfo.taskId, + displayId = taskInfo.displayId, + direction = Direction.ENTER, + transition = transition, + ) } /** Starts a transition to move an immersive task out of immersive. */ @@ -123,7 +120,7 @@ class DesktopImmersiveController( if (inProgress) { logV( "Cannot start exit because transition(s) already in progress: %s", - getRunningTransitions(), + pendingImmersiveTransitions, ) return } @@ -134,13 +131,12 @@ class DesktopImmersiveController( } logV("Moving task %d out of immersive mode, reason: %s", taskInfo.taskId, reason) val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this) - state = - TransitionState( - transition = transition, - displayId = taskInfo.displayId, - taskId = taskInfo.taskId, - direction = Direction.EXIT, - ) + addPendingImmersiveTransition( + taskId = taskInfo.taskId, + displayId = taskInfo.displayId, + direction = Direction.EXIT, + transition = transition, + ) } /** @@ -194,7 +190,13 @@ class DesktopImmersiveController( return ExitResult.Exit( exitingTask = immersiveTask, runOnTransitionStart = { transition -> - addPendingImmersiveExit(immersiveTask, displayId, transition) + addPendingImmersiveTransition( + taskId = immersiveTask, + displayId = displayId, + direction = Direction.EXIT, + transition = transition, + animate = false, + ) }, ) } @@ -220,10 +222,12 @@ class DesktopImmersiveController( return ExitResult.Exit( exitingTask = taskInfo.taskId, runOnTransitionStart = { transition -> - addPendingImmersiveExit( + addPendingImmersiveTransition( taskId = taskInfo.taskId, displayId = taskInfo.displayId, + direction = Direction.EXIT, transition = transition, + animate = false, ) }, ) @@ -233,14 +237,26 @@ class DesktopImmersiveController( /** Whether the [change] in the [transition] is a known immersive change. */ fun isImmersiveChange(transition: IBinder, change: TransitionInfo.Change): Boolean { - return pendingExternalExitTransitions.any { + return pendingImmersiveTransitions.any { it.transition == transition && it.taskId == change.taskInfo?.taskId } } - private fun addPendingImmersiveExit(taskId: Int, displayId: Int, transition: IBinder) { - pendingExternalExitTransitions.add( - ExternalPendingExit(taskId = taskId, displayId = displayId, transition = transition) + private fun addPendingImmersiveTransition( + taskId: Int, + displayId: Int, + direction: Direction, + transition: IBinder, + animate: Boolean = true, + ) { + pendingImmersiveTransitions.add( + PendingTransition( + taskId = taskId, + displayId = displayId, + direction = direction, + transition = transition, + animate = animate, + ) ) } @@ -251,19 +267,17 @@ class DesktopImmersiveController( finishTransaction: SurfaceControl.Transaction, finishCallback: Transitions.TransitionFinishCallback, ): Boolean { - val state = requireState() - check(state.transition == transition) { - "Transition $transition did not match expected state=$state" - } + val immersiveTransition = getImmersiveTransition(transition) ?: return false + if (!immersiveTransition.animate) return false logD("startAnimation transition=%s", transition) animateResize( - targetTaskId = state.taskId, + targetTaskId = immersiveTransition.taskId, info = info, startTransaction = startTransaction, finishTransaction = finishTransaction, finishCallback = { finishCallback.onTransitionFinished(/* wct= */ null) - clearState() + pendingImmersiveTransitions.remove(immersiveTransition) }, ) return true @@ -346,18 +360,6 @@ class DesktopImmersiveController( request: TransitionRequestInfo, ): WindowContainerTransaction? = null - override fun onTransitionConsumed( - transition: IBinder, - aborted: Boolean, - finishTransaction: SurfaceControl.Transaction?, - ) { - val state = this.state ?: return - if (transition == state.transition && aborted) { - clearState() - } - super.onTransitionConsumed(transition, aborted, finishTransaction) - } - /** * Called when any transition in the system is ready to play. This is needed to update the * repository state before window decorations are drawn (which happens immediately after @@ -371,67 +373,42 @@ class DesktopImmersiveController( finishTransaction: SurfaceControl.Transaction, ) { val desktopRepository: DesktopRepository = desktopUserRepositories.current - // Check if this is a pending external exit transition. - val pendingExit = - pendingExternalExitTransitions.firstOrNull { pendingExit -> - pendingExit.transition == transition - } - if (pendingExit != null) { - if (info.hasTaskChange(taskId = pendingExit.taskId)) { - if (desktopRepository.isTaskInFullImmersiveState(pendingExit.taskId)) { - logV("Pending external exit for task#%d verified", pendingExit.taskId) - desktopRepository.setTaskInFullImmersiveState( - displayId = pendingExit.displayId, - taskId = pendingExit.taskId, - immersive = false, - ) - if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) { - desktopRepository.removeBoundsBeforeFullImmersive(pendingExit.taskId) - } - } - } - return - } + val pendingTransition = getImmersiveTransition(transition) - // Check if this is a direct immersive enter/exit transition. - if (transition == state?.transition) { - val state = requireState() - val immersiveChange = - info.changes.firstOrNull { c -> c.taskInfo?.taskId == state.taskId } + if (pendingTransition != null) { + val taskId = pendingTransition.taskId + val immersiveChange = info.getTaskChange(taskId = taskId) if (immersiveChange == null) { logV( - "Direct move for task#%d in %s direction missing immersive change.", - state.taskId, - state.direction, + "Transition for task#%d in %s direction missing immersive change.", + taskId, + pendingTransition.direction, ) return } - val startBounds = immersiveChange.startAbsBounds - logV("Direct move for task#%d in %s direction verified", state.taskId, state.direction) - - when (state.direction) { - Direction.ENTER -> { - desktopRepository.setTaskInFullImmersiveState( - displayId = state.displayId, - taskId = state.taskId, - immersive = true, - ) - if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) { - desktopRepository.saveBoundsBeforeFullImmersive(state.taskId, startBounds) + logV( + "Immersive transition for task#%d in %s direction verified", + taskId, + pendingTransition.direction, + ) + desktopRepository.setTaskInFullImmersiveState( + displayId = pendingTransition.displayId, + taskId = taskId, + immersive = pendingTransition.direction == Direction.ENTER, + ) + if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) { + when (pendingTransition.direction) { + Direction.EXIT -> { + desktopRepository.removeBoundsBeforeFullImmersive(taskId) } - } - Direction.EXIT -> { - desktopRepository.setTaskInFullImmersiveState( - displayId = state.displayId, - taskId = state.taskId, - immersive = false, - ) - if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) { - desktopRepository.removeBoundsBeforeFullImmersive(state.taskId) + Direction.ENTER -> { + desktopRepository.saveBoundsBeforeFullImmersive( + taskId, + immersiveChange.startAbsBounds, + ) } } } - return } // Check if this is an untracked exit transition, like display rotation. @@ -450,35 +427,31 @@ class DesktopImmersiveController( } override fun onTransitionMerged(merged: IBinder, playing: IBinder) { - val pendingExit = - pendingExternalExitTransitions.firstOrNull { pendingExit -> - pendingExit.transition == merged + val pendingTransition = + pendingImmersiveTransitions.firstOrNull { pendingTransition -> + pendingTransition.transition == merged } - if (pendingExit != null) { + if (pendingTransition != null) { logV( - "Pending exit transition %s for task#%s merged into %s", + "Pending transition %s for task#%s merged into %s", merged, - pendingExit.taskId, + pendingTransition.taskId, playing, ) - pendingExit.transition = playing + pendingTransition.transition = playing } } override fun onTransitionFinished(transition: IBinder, aborted: Boolean) { - val pendingExit = - pendingExternalExitTransitions.firstOrNull { pendingExit -> - pendingExit.transition == transition - } - if (pendingExit != null) { - logV("Pending exit transition %s for task#%s finished", transition, pendingExit) - pendingExternalExitTransitions.remove(pendingExit) + val pendingTransition = getImmersiveTransition(transition) + if (pendingTransition != null) { + logV("Pending exit transition %s for task#%s finished", transition, pendingTransition) + pendingImmersiveTransitions.remove(pendingTransition) } } - private fun clearState() { - state = null - } + private fun getImmersiveTransition(transition: IBinder) = + pendingImmersiveTransitions.firstOrNull { it.transition == transition } private fun getExitDestinationBounds(taskInfo: RunningTaskInfo): Rect { val displayLayout = @@ -496,24 +469,13 @@ class DesktopImmersiveController( } } - private fun requireState(): TransitionState = - state ?: error("Expected non-null transition state") - - private fun getRunningTransitions(): List<IBinder> { - val running = mutableListOf<IBinder>() - state?.let { running.add(it.transition) } - pendingExternalExitTransitions.forEach { running.add(it.transition) } - return running - } - - private fun TransitionInfo.hasTaskChange(taskId: Int): Boolean = - changes.any { c -> c.taskInfo?.taskId == taskId } + private fun TransitionInfo.getTaskChange(taskId: Int): TransitionInfo.Change? = + changes.firstOrNull { c -> c.taskInfo?.taskId == taskId } private fun dump(pw: PrintWriter, prefix: String) { val innerPrefix = "$prefix " pw.println("${prefix}DesktopImmersiveController") - pw.println(innerPrefix + "state=" + state) - pw.println(innerPrefix + "pendingExternalExitTransitions=" + pendingExternalExitTransitions) + pw.println(innerPrefix + "pendingImmersiveTransitions=" + pendingImmersiveTransitions) } /** The state of the currently running transition. */ @@ -526,12 +488,22 @@ class DesktopImmersiveController( ) /** - * Tracks state of a transition involving an immersive exit that is external to this class' own - * transitions. This usually means transitions that exit immersive mode as a side-effect and not - * the primary action (for example, minimizing the immersive task or launching a new task on top - * of the immersive task). + * Tracks state of a transition involving an immersive enter or exit. This includes both + * transitions that should and should not be animated by this handler. + * + * @param taskId of the task that should enter/exit immersive mode + * @param displayId of the display that should enter/exit immersive mode + * @param direction of the immersive transition + * @param transition that will apply this transaction + * @param animate whether transition should be animated by this handler */ - data class ExternalPendingExit(val taskId: Int, val displayId: Int, var transition: IBinder) + data class PendingTransition( + val taskId: Int, + val displayId: Int, + val direction: Direction, + var transition: IBinder, + val animate: Boolean, + ) /** The result of an external exit request. */ sealed class ExitResult { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt index 14623cf9e703..606a729305b4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt @@ -235,8 +235,7 @@ fun isTaskWidthOrHeightEqual(taskBounds: Rect, stableBounds: Rect): Boolean { /** Returns true if task bound is equal to stable bounds else returns false. */ fun isTaskBoundsEqual(taskBounds: Rect, stableBounds: Rect): Boolean { - return taskBounds.width() == stableBounds.width() && - taskBounds.height() == stableBounds.height() + return taskBounds == stableBounds } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt index bccb609c41e8..c4abee3bed78 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt @@ -220,11 +220,18 @@ class DesktopRepository( fun isMinimizedTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.minimizedTasks } /** Checks if a task is the only visible, non-closing, non-minimized task on its display. */ - fun isOnlyVisibleNonClosingTask(taskId: Int): Boolean = - desktopTaskDataSequence().any { + fun isOnlyVisibleNonClosingTask(taskId: Int, displayId: Int = INVALID_DISPLAY): Boolean { + val seq = + if (displayId != INVALID_DISPLAY) { + sequenceOf(desktopTaskDataByDisplayId[displayId]).filterNotNull() + } else { + desktopTaskDataSequence() + } + return seq.any { it.visibleTasks.subtract(it.closingTasks).subtract(it.minimizedTasks).singleOrNull() == taskId } + } fun getActiveTasks(displayId: Int): ArraySet<Int> = ArraySet(desktopTaskDataByDisplayId[displayId]?.activeTasks) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 0bc7ca982ec2..9b7c3a4d929f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -383,12 +383,13 @@ class DesktopTasksController( taskId: Int, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, + remoteTransition: RemoteTransition? = null, ): Boolean { val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId) if (runningTask == null) { - return moveBackgroundTaskToDesktop(taskId, wct, transitionSource) + return moveBackgroundTaskToDesktop(taskId, wct, transitionSource, remoteTransition) } - moveRunningTaskToDesktop(runningTask, wct, transitionSource) + moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition) return true } @@ -396,6 +397,7 @@ class DesktopTasksController( taskId: Int, wct: WindowContainerTransaction, transitionSource: DesktopModeTransitionSource, + remoteTransition: RemoteTransition? = null, ): Boolean { if (recentTasksController?.findTaskInBackground(taskId) == null) { logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId) @@ -418,8 +420,17 @@ class DesktopTasksController( .apply { launchWindowingMode = WINDOWING_MODE_FREEFORM } .toBundle(), ) - // TODO(343149901): Add DPI changes for task launch - val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + + val transition: IBinder + if (remoteTransition != null) { + val transitionType = transitionType(remoteTransition) + val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition) + transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler) + remoteTransitionHandler.setTransition(transition) + } else { + // TODO(343149901): Add DPI changes for task launch + transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) @@ -433,6 +444,7 @@ class DesktopTasksController( task: RunningTaskInfo, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, + remoteTransition: RemoteTransition? = null, ) { if ( DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && @@ -450,12 +462,21 @@ class DesktopTasksController( excludeTaskId = task.taskId, reason = DesktopImmersiveController.ExitReason.TASK_LAUNCH, ) + // Bring other apps to front first val taskIdToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId) addMoveToDesktopChanges(wct, task) - val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + val transition: IBinder + if (remoteTransition != null) { + val transitionType = transitionType(remoteTransition) + val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition) + transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler) + remoteTransitionHandler.setTransition(transition) + } else { + transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) @@ -550,7 +571,7 @@ class DesktopTasksController( ): ((IBinder) -> Unit)? { val taskId = taskInfo.taskId desktopTilingDecorViewModel.removeTaskIfTiled(displayId, taskId) - performDesktopExitCleanupIfNeeded(taskId, wct) + performDesktopExitCleanupIfNeeded(taskId, displayId, wct) taskRepository.addClosingTask(displayId, taskId) taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate( doesAnyTaskRequireTaskbarRounding(displayId, taskId) @@ -589,7 +610,7 @@ class DesktopTasksController( val taskId = taskInfo.taskId val displayId = taskInfo.displayId val wct = WindowContainerTransaction() - performDesktopExitCleanupIfNeeded(taskId, wct) + performDesktopExitCleanupIfNeeded(taskId, displayId, wct) // Notify immersive handler as it might need to exit immersive state. val exitResult = desktopImmersiveController.exitImmersiveIfApplicable( @@ -843,6 +864,10 @@ class DesktopTasksController( if (!task.isFreeform) addMoveToDesktopChanges(wct, task, displayId) wct.reparent(task.token, displayAreaInfo.token, true /* onTop */) + if (Flags.enablePerDisplayDesktopWallpaperActivity()) { + performDesktopExitCleanupIfNeeded(task.taskId, task.displayId, wct) + } + transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) } @@ -1327,9 +1352,22 @@ class DesktopTasksController( * Remove wallpaper activity if task provided is last task and wallpaper activity token is not * null */ - private fun performDesktopExitCleanupIfNeeded(taskId: Int, wct: WindowContainerTransaction) { - if (!taskRepository.isOnlyVisibleNonClosingTask(taskId)) { - return + private fun performDesktopExitCleanupIfNeeded( + taskId: Int, + displayId: Int, + wct: WindowContainerTransaction, + ) { + if (Flags.enablePerDisplayDesktopWallpaperActivity()) { + if (!taskRepository.isOnlyVisibleNonClosingTask(taskId, displayId)) { + return + } + if (displayId != DEFAULT_DISPLAY) { + return + } + } else { + if (!taskRepository.isOnlyVisibleNonClosingTask(taskId)) { + return + } } desktopModeEnterExitTransitionListener?.onExitDesktopModeTransitionStarted( FULLSCREEN_ANIMATION_DURATION @@ -1823,7 +1861,7 @@ class DesktopTasksController( if (!isDesktopModeShowing(task.displayId)) return null val wct = WindowContainerTransaction() - performDesktopExitCleanupIfNeeded(task.taskId, wct) + performDesktopExitCleanupIfNeeded(task.taskId, task.displayId, wct) if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) { taskRepository.addClosingTask(task.displayId, task.taskId) @@ -1906,7 +1944,7 @@ class DesktopTasksController( wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) } - performDesktopExitCleanupIfNeeded(taskInfo.taskId, wct) + performDesktopExitCleanupIfNeeded(taskInfo.taskId, taskInfo.displayId, wct) } private fun cascadeWindow(bounds: Rect, displayLayout: DisplayLayout, displayId: Int) { @@ -1940,7 +1978,7 @@ class DesktopTasksController( // want it overridden in multi-window. wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) - performDesktopExitCleanupIfNeeded(taskInfo.taskId, wct) + performDesktopExitCleanupIfNeeded(taskInfo.taskId, taskInfo.displayId, wct) } /** Returns the ID of the Task that will be minimized, or null if no task will be minimized. */ @@ -2657,9 +2695,17 @@ class DesktopTasksController( } } - override fun moveToDesktop(taskId: Int, transitionSource: DesktopModeTransitionSource) { + override fun moveToDesktop( + taskId: Int, + transitionSource: DesktopModeTransitionSource, + remoteTransition: RemoteTransition?, + ) { executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c -> - c.moveTaskToDesktop(taskId, transitionSource = transitionSource) + c.moveTaskToDesktop( + taskId, + transitionSource = transitionSource, + remoteTransition = remoteTransition, + ) } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt index e5f52839d9f4..8b5d1c502bc9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt @@ -28,6 +28,7 @@ import com.android.wm.shell.desktopmode.persistence.DesktopRepositoryInitializer import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.shared.desktopmode.DesktopModeStatus +import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.sysui.UserChangeListener import kotlinx.coroutines.CoroutineScope @@ -36,6 +37,7 @@ import kotlinx.coroutines.CoroutineScope class DesktopUserRepositories( context: Context, shellInit: ShellInit, + private val shellController: ShellController, private val persistentRepository: DesktopPersistentRepository, private val repositoryInitializer: DesktopRepositoryInitializer, @ShellMainThread private val mainCoroutineScope: CoroutineScope, @@ -61,15 +63,16 @@ class DesktopUserRepositories( init { userId = ActivityManager.getCurrentUser() if (DesktopModeStatus.canEnterDesktopMode(context)) { - shellInit.addInitCallback(::initRepoFromPersistentStorage, this) + shellInit.addInitCallback(::onInit, this) } if (Flags.enableDesktopWindowingHsum()) { userIdToProfileIdsMap[userId] = userManager.getProfiles(userId).map { it.id } } } - private fun initRepoFromPersistentStorage() { + private fun onInit() { repositoryInitializer.initialize(this) + shellController.addUserChangeListener(this) } /** Returns [DesktopRepository] for the parent user id. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl index aac2361f717e..fa383cb55118 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl @@ -53,7 +53,8 @@ interface IDesktopMode { oneway void setTaskListener(IDesktopTaskListener listener); /** Move a task with given `taskId` to desktop */ - void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource); + void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource, + in @nullable RemoteTransition remoteTransition); /** Remove desktop on the given display */ oneway void removeDesktop(int displayId); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt index c5fca028a1a6..45d1281ba0e0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt @@ -23,7 +23,6 @@ import android.content.res.Resources import android.graphics.Point import android.os.SystemProperties import android.util.Slog -import androidx.core.content.withStyledAttributes import com.android.window.flags.Flags import com.android.wm.shell.R import com.android.wm.shell.desktopmode.CaptionState @@ -299,31 +298,12 @@ class AppHandleEducationController( } private fun tooltipColorScheme(captionState: CaptionState): TooltipColorScheme { - context.withStyledAttributes( - set = null, - attrs = - intArrayOf( - com.android.internal.R.attr.materialColorOnTertiaryFixed, - com.android.internal.R.attr.materialColorTertiaryFixed, - com.android.internal.R.attr.materialColorTertiaryFixedDim, - ), - defStyleAttr = 0, - defStyleRes = 0, - ) { - val onTertiaryFixed = getColor(/* index= */ 0, /* defValue= */ 0) - val tertiaryFixed = getColor(/* index= */ 1, /* defValue= */ 0) - val tertiaryFixedDim = getColor(/* index= */ 2, /* defValue= */ 0) - val taskInfo = (captionState as CaptionState.AppHandle).runningTaskInfo + val onTertiaryFixed = + context.getColor(com.android.internal.R.color.materialColorOnTertiaryFixed) + val tertiaryFixed = + context.getColor(com.android.internal.R.color.materialColorTertiaryFixed) - val tooltipContainerColor = - if (decorThemeUtil.getAppTheme(taskInfo) == Theme.LIGHT) { - tertiaryFixed - } else { - tertiaryFixedDim - } - return TooltipColorScheme(tooltipContainerColor, onTertiaryFixed, onTertiaryFixed) - } - return TooltipColorScheme(0, 0, 0) + return TooltipColorScheme(tertiaryFixed, onTertiaryFixed, onTertiaryFixed) } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index 582df486b2b3..3cc477602cf0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -562,6 +562,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb e.printStackTrace(); } + mAppOpsListener.setCallback(mTouchHandler.getMotionHelper()); + // Handle for system task stack changes. mTaskStackListener.addListener( new TaskStackListenerCallback() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java index 8ac7f89d8f8a..56a158b0c1c2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java @@ -269,6 +269,8 @@ public class TvPipController implements PipTransitionController.PipTransitionCal mShellController.addConfigurationChangeListener(this); mShellController.addUserChangeListener(this); + + mAppOpsListener.setCallback(mPipTaskOrganizer::removePip); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java index e309da10864d..a849b9de59ce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java @@ -23,6 +23,7 @@ import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.PictureInPictureParams; +import android.app.TaskInfo; import android.content.ComponentName; import android.content.Context; import android.content.pm.ActivityInfo; @@ -54,6 +55,7 @@ import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.pip.IPip; import com.android.wm.shell.common.pip.IPipAnimationListener; +import com.android.wm.shell.common.pip.PipAppOpsListener; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDisplayLayoutState; @@ -94,6 +96,7 @@ public class PipController implements ConfigurationChangeListener, private final ShellTaskOrganizer mShellTaskOrganizer; private final PipTransitionState mPipTransitionState; private final PipTouchHandler mPipTouchHandler; + private final PipAppOpsListener mPipAppOpsListener; private final ShellExecutor mMainExecutor; private final PipImpl mImpl; private final List<Consumer<Boolean>> mOnIsInPipStateChangedListeners = new ArrayList<>(); @@ -137,6 +140,7 @@ public class PipController implements ConfigurationChangeListener, ShellTaskOrganizer shellTaskOrganizer, PipTransitionState pipTransitionState, PipTouchHandler pipTouchHandler, + PipAppOpsListener pipAppOpsListener, ShellExecutor mainExecutor) { mContext = context; mShellCommandHandler = shellCommandHandler; @@ -152,6 +156,7 @@ public class PipController implements ConfigurationChangeListener, mPipTransitionState = pipTransitionState; mPipTransitionState.addPipTransitionStateChangedListener(this); mPipTouchHandler = pipTouchHandler; + mPipAppOpsListener = pipAppOpsListener; mMainExecutor = mainExecutor; mImpl = new PipImpl(); @@ -177,6 +182,7 @@ public class PipController implements ConfigurationChangeListener, ShellTaskOrganizer shellTaskOrganizer, PipTransitionState pipTransitionState, PipTouchHandler pipTouchHandler, + PipAppOpsListener pipAppOpsListener, ShellExecutor mainExecutor) { if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, @@ -186,7 +192,7 @@ public class PipController implements ConfigurationChangeListener, return new PipController(context, shellInit, shellCommandHandler, shellController, displayController, displayInsetsController, pipBoundsState, pipBoundsAlgorithm, pipDisplayLayoutState, pipScheduler, taskStackListener, shellTaskOrganizer, - pipTransitionState, pipTouchHandler, mainExecutor); + pipTransitionState, pipTouchHandler, pipAppOpsListener, mainExecutor); } public PipImpl getPipImpl() { @@ -225,6 +231,20 @@ public class PipController implements ConfigurationChangeListener, mPipScheduler.scheduleExitPipViaExpand(); } }); + + mPipAppOpsListener.setCallback(mPipTouchHandler.getMotionHelper()); + mPipTransitionState.addPipTransitionStateChangedListener( + (oldState, newState, extra) -> { + if (newState == PipTransitionState.ENTERED_PIP) { + final TaskInfo taskInfo = mPipTransitionState.getPipTaskInfo(); + if (taskInfo != null && taskInfo.topActivity != null) { + mPipAppOpsListener.onActivityPinned( + taskInfo.topActivity.getPackageName()); + } + } else if (newState == PipTransitionState.EXITED_PIP) { + mPipAppOpsListener.onActivityUnpinned(); + } + }); } private ExternalInterfaceBinder createExternalInterface() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java index dae3c21b6697..acb5622b041c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java @@ -124,7 +124,6 @@ public class PipTransition extends PipTransitionController implements // Internal state and relevant cached info // - @Nullable private Transitions.TransitionFinishCallback mFinishCallback; private ValueAnimator mTransitionAnimator; @@ -236,7 +235,6 @@ public class PipTransition extends PipTransitionController implements @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { - mFinishCallback = finishCallback; if (transition == mEnterTransition || info.getType() == TRANSIT_PIP) { mEnterTransition = null; // If we are in swipe PiP to Home transition we are ENTERING_PIP as a jumpcut transition @@ -282,7 +280,6 @@ public class PipTransition extends PipTransitionController implements if (isRemovePipTransition(info)) { return removePipImmediately(info, startTransaction, finishTransaction, finishCallback); } - mFinishCallback = null; return false; } @@ -331,6 +328,7 @@ public class PipTransition extends PipTransitionController implements if (pipChange == null) { return false; } + mFinishCallback = finishCallback; // We expect the PiP activity as a separate change in a config-at-end transition; // only flings are not using config-at-end for resize bounds changes TransitionInfo.Change pipActivityChange = getDeferConfigActivityChange(info, @@ -378,6 +376,7 @@ public class PipTransition extends PipTransitionController implements if (pipActivityChange == null) { return false; } + mFinishCallback = finishCallback; final SurfaceControl pipLeash = getLeash(pipChange); final Rect destinationBounds = pipChange.getEndAbsBounds(); @@ -446,6 +445,7 @@ public class PipTransition extends PipTransitionController implements if (pipActivityChange == null) { return false; } + mFinishCallback = finishCallback; final SurfaceControl pipLeash = getLeash(pipChange); final Rect startBounds = pipChange.getStartAbsBounds(); @@ -572,6 +572,7 @@ public class PipTransition extends PipTransitionController implements if (pipChange == null) { return false; } + mFinishCallback = finishCallback; Rect destinationBounds = pipChange.getEndAbsBounds(); SurfaceControl pipLeash = mPipTransitionState.getPinnedTaskLeash(); @@ -614,6 +615,7 @@ public class PipTransition extends PipTransitionController implements return false; } } + mFinishCallback = finishCallback; // The parent change if we were in a multi-activity PiP; null if single activity PiP. final TransitionInfo.Change parentBeforePip = pipChange.getTaskInfo() == null diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 2998a076a56c..5dd49f0b5c0f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -185,6 +185,7 @@ public class SplitScreenController implements SplitDragPolicy.Starter, private final LauncherApps mLauncherApps; private final RootTaskDisplayAreaOrganizer mRootTDAOrganizer; private final ShellExecutor mMainExecutor; + private final ShellExecutor mBgExecutor; private final Handler mMainHandler; private final SplitScreenImpl mImpl = new SplitScreenImpl(); private final DisplayController mDisplayController; @@ -231,7 +232,8 @@ public class SplitScreenController implements SplitDragPolicy.Starter, MultiInstanceHelper multiInstanceHelper, SplitState splitState, ShellExecutor mainExecutor, - Handler mainHandler) { + Handler mainHandler, + ShellExecutor bgExecutor) { mShellCommandHandler = shellCommandHandler; mShellController = shellController; mTaskOrganizer = shellTaskOrganizer; @@ -241,6 +243,7 @@ public class SplitScreenController implements SplitDragPolicy.Starter, mRootTDAOrganizer = rootTDAOrganizer; mMainExecutor = mainExecutor; mMainHandler = mainHandler; + mBgExecutor = bgExecutor; mDisplayController = displayController; mDisplayImeController = displayImeController; mDisplayInsetsController = displayInsetsController; @@ -298,8 +301,8 @@ public class SplitScreenController implements SplitDragPolicy.Starter, return new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mTaskOrganizer, mDisplayController, mDisplayImeController, mDisplayInsetsController, mTransitions, mTransactionPool, mIconProvider, - mMainExecutor, mMainHandler, mRecentTasksOptional, mLaunchAdjacentController, - mWindowDecorViewModel, mSplitState); + mMainExecutor, mMainHandler, mBgExecutor, mRecentTasksOptional, + mLaunchAdjacentController, mWindowDecorViewModel, mSplitState); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index ba724edb9747..e48c887c625f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -213,6 +213,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private final SplitscreenEventLogger mLogger; private final ShellExecutor mMainExecutor; private final Handler mMainHandler; + private final ShellExecutor mBgExecutor; // Cache live tile tasks while entering recents, evict them from stages in finish transaction // if user is opening another task(s). private final ArrayList<Integer> mPausingTasks = new ArrayList<>(); @@ -340,12 +341,20 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } }; - protected StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, - ShellTaskOrganizer taskOrganizer, DisplayController displayController, + protected StageCoordinator(Context context, + int displayId, + SyncTransactionQueue syncQueue, + ShellTaskOrganizer taskOrganizer, + DisplayController displayController, DisplayImeController displayImeController, - DisplayInsetsController displayInsetsController, Transitions transitions, - TransactionPool transactionPool, IconProvider iconProvider, ShellExecutor mainExecutor, - Handler mainHandler, Optional<RecentTasksController> recentTasks, + DisplayInsetsController displayInsetsController, + Transitions transitions, + TransactionPool transactionPool, + IconProvider iconProvider, + ShellExecutor mainExecutor, + Handler mainHandler, + ShellExecutor bgExecutor, + Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState) { mContext = context; @@ -355,6 +364,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mLogger = new SplitscreenEventLogger(); mMainExecutor = mainExecutor; mMainHandler = mainHandler; + mBgExecutor = bgExecutor; mRecentTasks = recentTasks; mLaunchAdjacentController = launchAdjacentController; mWindowDecorViewModel = windowDecorViewModel; @@ -370,6 +380,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, this /*stageListenerCallbacks*/, mSyncQueue, iconProvider, + mMainExecutor, + mBgExecutor, mWindowDecorViewModel); } else { mMainStage = new StageTaskListener( @@ -379,6 +391,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, this /*stageListenerCallbacks*/, mSyncQueue, iconProvider, + mMainExecutor, + mBgExecutor, mWindowDecorViewModel, STAGE_TYPE_MAIN); mSideStage = new StageTaskListener( mContext, @@ -387,6 +401,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, this /*stageListenerCallbacks*/, mSyncQueue, iconProvider, + mMainExecutor, + mBgExecutor, mWindowDecorViewModel, STAGE_TYPE_SIDE); } mDisplayController = displayController; @@ -408,13 +424,22 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } @VisibleForTesting - StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, - ShellTaskOrganizer taskOrganizer, StageTaskListener mainStage, - StageTaskListener sideStage, DisplayController displayController, + StageCoordinator(Context context, + int displayId, + SyncTransactionQueue syncQueue, + ShellTaskOrganizer taskOrganizer, + StageTaskListener mainStage, + StageTaskListener sideStage, + DisplayController displayController, DisplayImeController displayImeController, - DisplayInsetsController displayInsetsController, SplitLayout splitLayout, - Transitions transitions, TransactionPool transactionPool, ShellExecutor mainExecutor, - Handler mainHandler, Optional<RecentTasksController> recentTasks, + DisplayInsetsController displayInsetsController, + SplitLayout splitLayout, + Transitions transitions, + TransactionPool transactionPool, + ShellExecutor mainExecutor, + Handler mainHandler, + ShellExecutor bgExecutor, + Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState) { mContext = context; @@ -433,6 +458,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mLogger = new SplitscreenEventLogger(); mMainExecutor = mainExecutor; mMainHandler = mainHandler; + mBgExecutor = bgExecutor; mRecentTasks = recentTasks; mLaunchAdjacentController = launchAdjacentController; mWindowDecorViewModel = windowDecorViewModel; @@ -1969,32 +1995,32 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - int currentSnapPosition = mSplitLayout.calculateCurrentSnapPosition(); - - if (Flags.enableFlexibleTwoAppSplit()) { - // Split screen can be laid out in such a way that some of the apps are offscreen. - // For the purposes of passing SplitBounds up to launcher (for use in thumbnails - // etc.), we crop the bounds down to the screen size. - topLeftBounds.left = - Math.max(topLeftBounds.left, 0); - topLeftBounds.top = - Math.max(topLeftBounds.top, 0); - bottomRightBounds.right = - Math.min(bottomRightBounds.right, mSplitLayout.getDisplayWidth()); - bottomRightBounds.top = - Math.min(bottomRightBounds.top, mSplitLayout.getDisplayHeight()); - - // TODO (b/349828130): Can change to getState() fully after brief soak time. - if (mSplitState.get() != currentSnapPosition) { - Log.wtf(TAG, "SplitState is " + mSplitState.get() - + ", expected " + currentSnapPosition); - currentSnapPosition = mSplitState.get(); + // If all stages are filled, create new SplitBounds and update Recents. + if (mainStageTopTaskId != INVALID_TASK_ID && sideStageTopTaskId != INVALID_TASK_ID) { + int currentSnapPosition = mSplitLayout.calculateCurrentSnapPosition(); + if (Flags.enableFlexibleTwoAppSplit()) { + // Split screen can be laid out in such a way that some of the apps are + // offscreen. For the purposes of passing SplitBounds up to launcher (for use in + // thumbnails etc.), we crop the bounds down to the screen size. + topLeftBounds.left = + Math.max(topLeftBounds.left, 0); + topLeftBounds.top = + Math.max(topLeftBounds.top, 0); + bottomRightBounds.right = + Math.min(bottomRightBounds.right, mSplitLayout.getDisplayWidth()); + bottomRightBounds.top = + Math.min(bottomRightBounds.top, mSplitLayout.getDisplayHeight()); + + // TODO (b/349828130): Can change to getState() fully after brief soak time. + if (mSplitState.get() != currentSnapPosition) { + Log.wtf(TAG, "SplitState is " + mSplitState.get() + + ", expected " + currentSnapPosition); + currentSnapPosition = mSplitState.get(); + } } - } + SplitBounds splitBounds = new SplitBounds(topLeftBounds, bottomRightBounds, + leftTopTaskId, rightBottomTaskId, currentSnapPosition); - SplitBounds splitBounds = new SplitBounds(topLeftBounds, bottomRightBounds, - leftTopTaskId, rightBottomTaskId, currentSnapPosition); - if (mainStageTopTaskId != INVALID_TASK_ID && sideStageTopTaskId != INVALID_TASK_ID) { // Update the pair for the top tasks boolean added = recentTasks.addSplitPair(mainStageTopTaskId, sideStageTopTaskId, splitBounds); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt index 3fa8df40dfef..5256e7867499 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt @@ -20,6 +20,7 @@ import android.content.Context import com.android.internal.protolog.ProtoLog import com.android.launcher3.icons.IconProvider import com.android.wm.shell.ShellTaskOrganizer +import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.common.SyncTransactionQueue import com.android.wm.shell.protolog.ShellProtoLogGroup import com.android.wm.shell.shared.split.SplitScreenConstants @@ -52,6 +53,8 @@ class StageOrderOperator ( stageCallbacks: StageTaskListener.StageListenerCallbacks, syncQueue: SyncTransactionQueue, iconProvider: IconProvider, + mainExecutor: ShellExecutor, + bgExecutor: ShellExecutor, windowDecorViewModel: Optional<WindowDecorViewModel> ) { @@ -83,6 +86,8 @@ class StageOrderOperator ( stageCallbacks, syncQueue, iconProvider, + mainExecutor, + bgExecutor, windowDecorViewModel, stageIds[i]) ) @@ -95,13 +100,16 @@ class StageOrderOperator ( */ fun onEnteringSplit(@SnapPosition goingToLayout: Int) { if (goingToLayout == currentLayout) { - // Add protolog here. Return for now, but maybe we want to handle swap case, TBD + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, + "Entering Split requested same layout split is in: %d", goingToLayout) return } val freeStages: List<StageTaskListener> = allStages.filterNot { activeStages.contains(it) } when(goingToLayout) { - SplitScreenConstants.SNAP_TO_2_50_50 -> { + SplitScreenConstants.SNAP_TO_2_50_50, + SplitScreenConstants.SNAP_TO_2_33_66, + SplitScreenConstants.SNAP_TO_2_66_33 -> { if (activeStages.size < 2) { // take from allStages and add into activeStages for (i in 0 until (2 - activeStages.size)) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index f1245ba26cc2..816f51f997d5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -48,6 +48,7 @@ import com.android.internal.protolog.ProtoLog; import com.android.internal.util.ArrayUtils; import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SurfaceUtils; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.split.SplitDecorManager; @@ -95,6 +96,8 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { private final StageListenerCallbacks mCallbacks; private final SyncTransactionQueue mSyncQueue; private final IconProvider mIconProvider; + private final ShellExecutor mMainExecutor; + private final ShellExecutor mBgExecutor; private final Optional<WindowDecorViewModel> mWindowDecorViewModel; /** Whether or not the root task has been created. */ @@ -111,14 +114,21 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { // TODO(b/204308910): Extracts SplitDecorManager related code to common package. private SplitDecorManager mSplitDecorManager; - StageTaskListener(Context context, ShellTaskOrganizer taskOrganizer, int displayId, - StageListenerCallbacks callbacks, SyncTransactionQueue syncQueue, + StageTaskListener(Context context, + ShellTaskOrganizer taskOrganizer, + int displayId, + StageListenerCallbacks callbacks, + SyncTransactionQueue syncQueue, IconProvider iconProvider, + ShellExecutor mainExecutor, + ShellExecutor bgExecutor, Optional<WindowDecorViewModel> windowDecorViewModel, int id) { mContext = context; mCallbacks = callbacks; mSyncQueue = syncQueue; mIconProvider = iconProvider; + mMainExecutor = mainExecutor; + mBgExecutor = bgExecutor; mWindowDecorViewModel = windowDecorViewModel; taskOrganizer.createRootTask(displayId, WINDOWING_MODE_MULTI_WINDOW, this); mId = id; @@ -214,9 +224,8 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { if (mRootTaskInfo == null) { mRootLeash = leash; mRootTaskInfo = taskInfo; - mSplitDecorManager = new SplitDecorManager( - mRootTaskInfo.configuration, - mIconProvider); + mSplitDecorManager = new SplitDecorManager(mRootTaskInfo.configuration, mIconProvider, + mMainExecutor, mBgExecutor); mHasRootTask = true; mCallbacks.onRootTaskAppeared(); if (mVisible != mRootTaskInfo.isVisible) { @@ -344,12 +353,6 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } - void screenshotIfNeeded(SurfaceControl.Transaction t) { - if (mSplitDecorManager != null) { - mSplitDecorManager.screenshotIfNeeded(t); - } - } - void fadeOutDecor(Runnable finishedCallback) { if (mSplitDecorManager != null) { mSplitDecorManager.fadeOutDecor(finishedCallback, false /* addDelay */); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java index c5e158c6b452..ea7553061137 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java @@ -53,6 +53,7 @@ public class TvSplitScreenController extends SplitScreenController { private final SyncTransactionQueue mSyncQueue; private final Context mContext; private final ShellExecutor mMainExecutor; + private final ShellExecutor mBgExecutor; private final DisplayController mDisplayController; private final DisplayImeController mDisplayImeController; private final DisplayInsetsController mDisplayInsetsController; @@ -85,18 +86,20 @@ public class TvSplitScreenController extends SplitScreenController { SplitState splitState, ShellExecutor mainExecutor, Handler mainHandler, + ShellExecutor bgExecutor, SystemWindows systemWindows) { super(context, shellInit, shellCommandHandler, shellController, shellTaskOrganizer, syncQueue, rootTDAOrganizer, displayController, displayImeController, displayInsetsController, null, transitions, transactionPool, iconProvider, recentTasks, launchAdjacentController, Optional.empty(), Optional.empty(), null /* stageCoordinator */, multiInstanceHelper, splitState, - mainExecutor, mainHandler); - + mainExecutor, mainHandler, bgExecutor); mTaskOrganizer = shellTaskOrganizer; mSyncQueue = syncQueue; mContext = context; mMainExecutor = mainExecutor; + mMainHandler = mainHandler; + mBgExecutor = bgExecutor; mDisplayController = displayController; mDisplayImeController = displayImeController; mDisplayInsetsController = displayInsetsController; @@ -106,8 +109,6 @@ public class TvSplitScreenController extends SplitScreenController { mRecentTasksOptional = recentTasks; mLaunchAdjacentController = launchAdjacentController; mSplitState = splitState; - - mMainHandler = mainHandler; mSystemWindows = systemWindows; } @@ -120,7 +121,7 @@ public class TvSplitScreenController extends SplitScreenController { return new TvStageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mTaskOrganizer, mDisplayController, mDisplayImeController, mDisplayInsetsController, mTransitions, mTransactionPool, - mIconProvider, mMainExecutor, mMainHandler, + mIconProvider, mMainExecutor, mMainHandler, mBgExecutor, mRecentTasksOptional, mLaunchAdjacentController, mSplitState, mSystemWindows); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java index ef1f88e635d3..a318bcf97e6e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java @@ -51,15 +51,15 @@ public class TvStageCoordinator extends StageCoordinator DisplayInsetsController displayInsetsController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, ShellExecutor mainExecutor, - Handler mainHandler, + Handler mainHandler, ShellExecutor bgExecutor, Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, SplitState splitState, SystemWindows systemWindows) { super(context, displayId, syncQueue, taskOrganizer, displayController, displayImeController, displayInsetsController, transitions, transactionPool, iconProvider, - mainExecutor, mainHandler, recentTasks, launchAdjacentController, Optional.empty(), - splitState); + mainExecutor, mainHandler, bgExecutor, recentTasks, launchAdjacentController, + Optional.empty(), splitState); mTvSplitMenuController = new TvSplitMenuController(context, this, systemWindows, mainHandler); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java index 03ded730865e..b0547a2a47b1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java @@ -204,6 +204,7 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "tryAnimateOpenIntentWithRemoteAndPipOrDesktop"); TransitionInfo.Change pipChange = null; + TransitionInfo.Change pipActivityChange = null; for (int i = info.getChanges().size() - 1; i >= 0; --i) { TransitionInfo.Change change = info.getChanges().get(i); if (mPipHandler.isEnteringPip(change, info.getType())) { @@ -213,6 +214,12 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { } pipChange = change; info.getChanges().remove(i); + } else if (change.getTaskInfo() == null && change.getParent() != null + && pipChange != null && change.getParent().equals(pipChange.getContainer())) { + // Cache the PiP activity if it's a target and cached pip task change is its parent; + // note that we are bottom-to-top, so if such activity has a task + // that is also a target, then it must have been cached already as pipChange. + pipActivityChange = change; } } TransitionInfo.Change desktopChange = null; @@ -257,8 +264,16 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { // make a new startTransaction because pip's startEnterAnimation "consumes" it so // we need a separate one to send over to launcher. SurfaceControl.Transaction otherStartT = new SurfaceControl.Transaction(); - - mPipHandler.startEnterAnimation(pipChange, otherStartT, finishTransaction, finishCB); + if (pipActivityChange == null) { + mPipHandler.startEnterAnimation(pipChange, otherStartT, finishTransaction, + finishCB); + } else { + info.getChanges().remove(pipActivityChange); + TransitionInfo pipInfo = subCopy(info, TRANSIT_PIP, false /* withChanges */); + pipInfo.getChanges().addAll(List.of(pipChange, pipActivityChange)); + mPipHandler.startAnimation(mTransition, pipInfo, startTransaction, + finishTransaction, finishCB); + } // Dispatch the rest of the transition normally. if (mLeftoversHandler != null diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index 611f3e0ac5e8..a7d6301ecf06 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -1076,9 +1076,11 @@ public class Transitions implements RemoteCallable<Transitions>, @Nullable TransitionHandler skip ) { for (int i = mHandlers.size() - 1; i >= 0; --i) { - if (mHandlers.get(i) == skip) continue; - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " try handler %s", - mHandlers.get(i)); + if (mHandlers.get(i) == skip) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " skip handler %s", + mHandlers.get(i)); + continue; + } boolean consumed = mHandlers.get(i).startAnimation(transition, info, startT, finishT, finishCB); if (consumed) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 0f5813c7807b..5a05861c3a88 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -140,6 +140,7 @@ import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration.ExclusionRegionListener; +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader; import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost; import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier; import com.android.wm.shell.windowdecor.extension.InsetsStateKt; @@ -150,7 +151,9 @@ import kotlin.Pair; import kotlin.Unit; import kotlin.jvm.functions.Function1; +import kotlinx.coroutines.CoroutineScope; import kotlinx.coroutines.ExperimentalCoroutinesApi; +import kotlinx.coroutines.MainCoroutineDispatcher; import java.io.PrintWriter; import java.util.ArrayList; @@ -177,6 +180,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, private final ShellController mShellController; private final Context mContext; private final @ShellMainThread Handler mMainHandler; + private final @ShellMainThread MainCoroutineDispatcher mMainDispatcher; + private final @ShellBackgroundThread CoroutineScope mBgScope; private final @ShellBackgroundThread ShellExecutor mBgExecutor; private final Choreographer mMainChoreographer; private final DisplayController mDisplayController; @@ -241,12 +246,15 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, private final FocusTransitionObserver mFocusTransitionObserver; private final DesktopModeEventLogger mDesktopModeEventLogger; private final DesktopModeUiEventLogger mDesktopModeUiEventLogger; + private final WindowDecorTaskResourceLoader mTaskResourceLoader; public DesktopModeWindowDecorViewModel( Context context, ShellExecutor shellExecutor, @ShellMainThread Handler mainHandler, Choreographer mainChoreographer, + @ShellMainThread MainCoroutineDispatcher mainDispatcher, + @ShellBackgroundThread CoroutineScope bgScope, @ShellBackgroundThread ShellExecutor bgExecutor, ShellInit shellInit, ShellCommandHandler shellCommandHandler, @@ -273,12 +281,15 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler, FocusTransitionObserver focusTransitionObserver, DesktopModeEventLogger desktopModeEventLogger, - DesktopModeUiEventLogger desktopModeUiEventLogger) { + DesktopModeUiEventLogger desktopModeUiEventLogger, + WindowDecorTaskResourceLoader taskResourceLoader) { this( context, shellExecutor, mainHandler, mainChoreographer, + mainDispatcher, + bgScope, bgExecutor, shellInit, shellCommandHandler, @@ -311,7 +322,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, new TaskPositionerFactory(), focusTransitionObserver, desktopModeEventLogger, - desktopModeUiEventLogger); + desktopModeUiEventLogger, + taskResourceLoader); } @VisibleForTesting @@ -320,6 +332,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, ShellExecutor shellExecutor, @ShellMainThread Handler mainHandler, Choreographer mainChoreographer, + @ShellMainThread MainCoroutineDispatcher mainDispatcher, + @ShellBackgroundThread CoroutineScope bgScope, @ShellBackgroundThread ShellExecutor bgExecutor, ShellInit shellInit, ShellCommandHandler shellCommandHandler, @@ -352,11 +366,14 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, TaskPositionerFactory taskPositionerFactory, FocusTransitionObserver focusTransitionObserver, DesktopModeEventLogger desktopModeEventLogger, - DesktopModeUiEventLogger desktopModeUiEventLogger) { + DesktopModeUiEventLogger desktopModeUiEventLogger, + WindowDecorTaskResourceLoader taskResourceLoader) { mContext = context; mMainExecutor = shellExecutor; mMainHandler = mainHandler; mMainChoreographer = mainChoreographer; + mMainDispatcher = mainDispatcher; + mBgScope = bgScope; mBgExecutor = bgExecutor; mActivityTaskManager = mContext.getSystemService(ActivityTaskManager.class); mTaskOrganizer = taskOrganizer; @@ -418,6 +435,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mFocusTransitionObserver = focusTransitionObserver; mDesktopModeEventLogger = desktopModeEventLogger; mDesktopModeUiEventLogger = desktopModeUiEventLogger; + mTaskResourceLoader = taskResourceLoader; shellInit.addInitCallback(this::onInit, this); } @@ -717,7 +735,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, // App sometimes draws before the insets from WindowDecoration#relayout have // been added, so they must be added here decoration.addCaptionInset(wct); - mDesktopTasksController.moveTaskToDesktop(taskId, wct, source); + mDesktopTasksController.moveTaskToDesktop(taskId, wct, source, + /* remoteTransition= */ null); decoration.closeHandleMenu(); if (source == DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) { @@ -1639,12 +1658,16 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, : mContext, mContext.createContextAsUser(UserHandle.of(taskInfo.userId), 0 /* flags */), mDisplayController, + mTaskResourceLoader, mSplitScreenController, mDesktopUserRepositories, mTaskOrganizer, taskInfo, taskSurface, mMainHandler, + mMainExecutor, + mMainDispatcher, + mBgScope, mBgExecutor, mMainChoreographer, mSyncQueue, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 6562f38e724d..febf5669d12d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -28,7 +28,6 @@ import static android.window.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_ import static android.window.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION_ALWAYS; -import static com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT; import static com.android.wm.shell.shared.desktopmode.DesktopModeStatus.canEnterDesktopMode; import static com.android.wm.shell.shared.desktopmode.DesktopModeStatus.canEnterDesktopModeOrShowAppHandle; import static com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON; @@ -49,9 +48,6 @@ import android.app.assist.AssistContent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; @@ -60,13 +56,11 @@ import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.Region; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Handler; import android.os.Trace; import android.os.UserHandle; import android.util.Size; -import android.util.Slog; import android.view.Choreographer; import android.view.InsetsState; import android.view.MotionEvent; @@ -81,8 +75,6 @@ import android.window.TaskSnapshot; import android.window.WindowContainerTransaction; import com.android.internal.annotations.VisibleForTesting; -import com.android.launcher3.icons.BaseIconFactory; -import com.android.launcher3.icons.IconProvider; import com.android.window.flags.Flags; import com.android.wm.shell.R; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; @@ -98,13 +90,16 @@ import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.CaptionState; import com.android.wm.shell.desktopmode.DesktopModeEventLogger; +import com.android.wm.shell.desktopmode.DesktopModeUtils; import com.android.wm.shell.desktopmode.DesktopUserRepositories; import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; +import com.android.wm.shell.shared.annotations.ShellMainThread; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource; import com.android.wm.shell.shared.multiinstance.ManageWindowsViewContainer; import com.android.wm.shell.splitscreen.SplitScreenController; +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader; import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost; import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier; import com.android.wm.shell.windowdecor.extension.TaskInfoKt; @@ -117,7 +112,11 @@ import kotlin.Unit; import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function1; +import kotlinx.coroutines.CoroutineScope; +import kotlinx.coroutines.MainCoroutineDispatcher; + import java.util.List; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Supplier; @@ -133,12 +132,16 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @VisibleForTesting static final long CLOSE_MAXIMIZE_MENU_DELAY_MS = 150L; - private final Handler mHandler; + private final @ShellMainThread Handler mHandler; + private final @ShellMainThread ShellExecutor mMainExecutor; + private final @ShellMainThread MainCoroutineDispatcher mMainDispatcher; + private final @ShellBackgroundThread CoroutineScope mBgScope; private final @ShellBackgroundThread ShellExecutor mBgExecutor; private final Choreographer mChoreographer; private final SyncTransactionQueue mSyncQueue; private final SplitScreenController mSplitScreenController; private final WindowManagerWrapper mWindowManagerWrapper; + private final @NonNull WindowDecorTaskResourceLoader mTaskResourceLoader; private WindowDecorationViewHolder mWindowDecorViewHolder; private View.OnClickListener mOnCaptionButtonClickListener; @@ -174,10 +177,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private OpenByDefaultDialog mOpenByDefaultDialog; private ResizeVeil mResizeVeil; - private Bitmap mAppIconBitmap; - private Bitmap mResizeVeilBitmap; - private CharSequence mAppName; private CapturedLink mCapturedLink; private Uri mGenericLink; private Uri mWebUri; @@ -204,16 +204,23 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private final WindowDecorCaptionHandleRepository mWindowDecorCaptionHandleRepository; private final DesktopUserRepositories mDesktopUserRepositories; + private Runnable mLoadAppInfoRunnable; + private Runnable mSetAppInfoRunnable; + public DesktopModeWindowDecoration( Context context, @NonNull Context userContext, DisplayController displayController, + @NonNull WindowDecorTaskResourceLoader taskResourceLoader, SplitScreenController splitScreenController, DesktopUserRepositories desktopUserRepositories, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, - Handler handler, + @ShellMainThread Handler handler, + @ShellMainThread ShellExecutor mainExecutor, + @ShellMainThread MainCoroutineDispatcher mainDispatcher, + @ShellBackgroundThread CoroutineScope bgScope, @ShellBackgroundThread ShellExecutor bgExecutor, Choreographer choreographer, SyncTransactionQueue syncQueue, @@ -225,12 +232,13 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin MultiInstanceHelper multiInstanceHelper, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, DesktopModeEventLogger desktopModeEventLogger) { - this (context, userContext, displayController, splitScreenController, + this (context, userContext, displayController, taskResourceLoader, splitScreenController, desktopUserRepositories, taskOrganizer, taskInfo, taskSurface, handler, - bgExecutor, choreographer, syncQueue, appHeaderViewHolderFactory, - rootTaskDisplayAreaOrganizer, genericLinksParser, assistContentRequester, - SurfaceControl.Builder::new, SurfaceControl.Transaction::new, - WindowContainerTransaction::new, SurfaceControl::new, new WindowManagerWrapper( + mainExecutor, mainDispatcher, bgScope, bgExecutor, choreographer, syncQueue, + appHeaderViewHolderFactory, rootTaskDisplayAreaOrganizer, genericLinksParser, + assistContentRequester, SurfaceControl.Builder::new, + SurfaceControl.Transaction::new, WindowContainerTransaction::new, + SurfaceControl::new, new WindowManagerWrapper( context.getSystemService(WindowManager.class)), new SurfaceControlViewHostFactory() {}, windowDecorViewHostSupplier, @@ -243,12 +251,16 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin Context context, @NonNull Context userContext, DisplayController displayController, + @NonNull WindowDecorTaskResourceLoader taskResourceLoader, SplitScreenController splitScreenController, DesktopUserRepositories desktopUserRepositories, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, - Handler handler, + @ShellMainThread Handler handler, + @ShellMainThread ShellExecutor mainExecutor, + @ShellMainThread MainCoroutineDispatcher mainDispatcher, + @ShellBackgroundThread CoroutineScope bgScope, @ShellBackgroundThread ShellExecutor bgExecutor, Choreographer choreographer, SyncTransactionQueue syncQueue, @@ -274,6 +286,9 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin surfaceControlViewHostFactory, windowDecorViewHostSupplier, desktopModeEventLogger); mSplitScreenController = splitScreenController; mHandler = handler; + mMainExecutor = mainExecutor; + mMainDispatcher = mainDispatcher; + mBgScope = bgScope; mBgExecutor = bgExecutor; mChoreographer = choreographer; mSyncQueue = syncQueue; @@ -287,6 +302,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mWindowManagerWrapper = windowManagerWrapper; mWindowDecorCaptionHandleRepository = windowDecorCaptionHandleRepository; mDesktopUserRepositories = desktopUserRepositories; + mTaskResourceLoader = taskResourceLoader; + mTaskResourceLoader.onWindowDecorCreated(taskInfo); } /** @@ -503,6 +520,14 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin if (oldRootView != mResult.mRootView) { disposeStatusBarInputLayer(); mWindowDecorViewHolder = createViewHolder(); + // Load these only when first creating the view. + loadTaskNameAndIconInBackground((name, icon) -> { + final AppHeaderViewHolder appHeader = asAppHeader(mWindowDecorViewHolder); + if (appHeader != null) { + appHeader.setAppName(name); + appHeader.setAppIcon(icon); + } + }); } final Point position = new Point(); @@ -522,7 +547,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin } else { mWindowDecorViewHolder.bindData(new AppHeaderViewHolder.HeaderData( mTaskInfo, - TaskInfoKt.getRequestingImmersive(mTaskInfo), + DesktopModeUtils.isTaskMaximized(mTaskInfo, mDisplayController), inFullImmersive, hasGlobalFocus, /* maximizeHoverEnabled= */ canOpenMaximizeMenu( @@ -541,6 +566,33 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin Trace.endSection(); // DesktopModeWindowDecoration#relayout } + /** + * Loads the task's name and icon in a background thread and posts the results back in the + * main thread. + */ + private void loadTaskNameAndIconInBackground(BiConsumer<CharSequence, Bitmap> onResult) { + if (mWindowDecorViewHolder == null) return; + if (asAppHeader(mWindowDecorViewHolder) == null) { + // Only needed when drawing a header. + return; + } + if (mLoadAppInfoRunnable != null) { + mBgExecutor.removeCallbacks(mLoadAppInfoRunnable); + } + if (mSetAppInfoRunnable != null) { + mMainExecutor.removeCallbacks(mSetAppInfoRunnable); + } + mLoadAppInfoRunnable = () -> { + final CharSequence name = mTaskResourceLoader.getName(mTaskInfo); + final Bitmap icon = mTaskResourceLoader.getHeaderIcon(mTaskInfo); + mSetAppInfoRunnable = () -> { + onResult.accept(name, icon); + }; + mMainExecutor.execute(mSetAppInfoRunnable); + }; + mBgExecutor.execute(mLoadAppInfoRunnable); + } + private boolean isCaptionVisible() { return mTaskInfo.isVisible && mIsCaptionVisible; } @@ -556,10 +608,10 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @Nullable private Intent getBrowserLink() { final Uri browserLink; - if (isCapturedLinkAvailable()) { - browserLink = mCapturedLink.mUri; - } else if (mWebUri != null) { + if (mWebUri != null) { browserLink = mWebUri; + } else if (isCapturedLinkAvailable()) { + browserLink = mCapturedLink.mUri; } else { browserLink = mGenericLink; } @@ -760,15 +812,12 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin ); } else if (mRelayoutParams.mLayoutResId == R.layout.desktop_mode_app_header) { - loadAppInfoIfNeeded(); return mAppHeaderViewHolderFactory.create( mResult.mRootView, mOnCaptionTouchListener, mOnCaptionButtonClickListener, mOnCaptionLongClickListener, mOnCaptionGenericMotionListener, - mAppName, - mAppIconBitmap, mOnMaximizeHoverListener); } throw new IllegalArgumentException("Unexpected layout resource id"); @@ -1032,7 +1081,10 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mTaskInfo, mTaskSurface, mDisplayController, + mTaskResourceLoader, mSurfaceControlTransactionSupplier, + mMainDispatcher, + mBgScope, new OpenByDefaultDialog.DialogLifecycleListener() { @Override public void onDialogCreated() { @@ -1043,9 +1095,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin public void onDialogDismissed() { mOpenByDefaultDialog = null; } - }, - mAppIconBitmap, - mAppName + } ); } @@ -1057,50 +1107,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin return mDragResizeListener != null && mDragResizeListener.isHandlingDragResize(); } - private void loadAppInfoIfNeeded() { - // TODO(b/337370277): move this to another thread. - try { - Trace.beginSection("DesktopModeWindowDecoration#loadAppInfoIfNeeded"); - if (mAppIconBitmap != null && mAppName != null) { - return; - } - if (mTaskInfo.baseIntent == null) { - Slog.e(TAG, "Base intent not found in task"); - return; - } - final PackageManager pm = mUserContext.getPackageManager(); - final ActivityInfo activityInfo = - pm.getActivityInfo(mTaskInfo.baseIntent.getComponent(), 0 /* flags */); - final IconProvider provider = new IconProvider(mContext); - final Drawable appIconDrawable = provider.getIcon(activityInfo); - final Drawable badgedAppIconDrawable = pm.getUserBadgedIcon(appIconDrawable, - UserHandle.of(mTaskInfo.userId)); - final BaseIconFactory headerIconFactory = createIconFactory(mContext, - R.dimen.desktop_mode_caption_icon_radius); - mAppIconBitmap = headerIconFactory.createIconBitmap(badgedAppIconDrawable, - 1f /* scale */); - - final BaseIconFactory resizeVeilIconFactory = createIconFactory(mContext, - R.dimen.desktop_mode_resize_veil_icon_size); - mResizeVeilBitmap = resizeVeilIconFactory - .createScaledBitmap(appIconDrawable, MODE_DEFAULT); - - final ApplicationInfo applicationInfo = activityInfo.applicationInfo; - mAppName = pm.getApplicationLabel(applicationInfo); - } catch (PackageManager.NameNotFoundException e) { - Slog.e(TAG, "Base activity's component name cannot be found on the system", e); - } finally { - Trace.endSection(); - } - } - - private BaseIconFactory createIconFactory(Context context, int dimensions) { - final Resources resources = context.getResources(); - final int densityDpi = resources.getDisplayMetrics().densityDpi; - final int iconSize = resources.getDimensionPixelSize(dimensions); - return new BaseIconFactory(context, densityDpi, iconSize); - } - private void closeDragResizeListener() { if (mDragResizeListener == null) { return; @@ -1115,9 +1121,9 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin */ private void createResizeVeilIfNeeded() { if (mResizeVeil != null) return; - loadAppInfoIfNeeded(); - mResizeVeil = new ResizeVeil(mContext, mDisplayController, mResizeVeilBitmap, - mTaskSurface, mSurfaceControlTransactionSupplier, mTaskInfo); + mResizeVeil = new ResizeVeil(mContext, mDisplayController, mTaskResourceLoader, + mMainDispatcher, mBgScope, mTaskSurface, + mSurfaceControlTransactionSupplier, mTaskInfo); } /** @@ -1316,8 +1322,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin */ @VisibleForTesting void onAssistContentReceived(@Nullable AssistContent assistContent) { - mWebUri = assistContent == null ? null : assistContent.getWebUri(); - loadAppInfoIfNeeded(); + mWebUri = assistContent == null ? null : AppToWebUtils.getSessionWebUri(assistContent); updateGenericLink(); final boolean supportsMultiInstance = mMultiInstanceHelper .supportsMultiInstanceSplit(mTaskInfo.baseActivity) @@ -1330,11 +1335,12 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin .isTaskInFullImmersiveState(mTaskInfo.taskId); final boolean isBrowserApp = isBrowserApp(); mHandleMenu = mHandleMenuFactory.create( + mMainDispatcher, + mBgScope, this, mWindowManagerWrapper, + mTaskResourceLoader, mRelayoutParams.mLayoutResId, - mAppIconBitmap, - mAppName, mSplitScreenController, canEnterDesktopModeOrShowAppHandle(mContext), supportsMultiInstance, @@ -1623,12 +1629,20 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @Override public void close() { + if (mLoadAppInfoRunnable != null) { + mBgExecutor.removeCallbacks(mLoadAppInfoRunnable); + } + if (mSetAppInfoRunnable != null) { + mMainExecutor.removeCallbacks(mSetAppInfoRunnable); + } + mTaskResourceLoader.onWindowDecorClosed(mTaskInfo); closeDragResizeListener(); closeHandleMenu(); closeManageWindowsMenu(); mExclusionRegionListener.onExclusionRegionDismissed(mTaskInfo.taskId); disposeResizeVeil(); disposeStatusBarInputLayer(); + mWindowDecorViewHolder = null; if (canEnterDesktopMode(mContext) && isEducationEnabled()) { notifyNoCaptionHandle(); } @@ -1705,7 +1719,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin .isTaskInFullImmersiveState(mTaskInfo.taskId); asAppHeader(mWindowDecorViewHolder).bindData(new AppHeaderViewHolder.HeaderData( mTaskInfo, - TaskInfoKt.getRequestingImmersive(mTaskInfo), + DesktopModeUtils.isTaskMaximized(mTaskInfo, mDisplayController), inFullImmersive, isFocused(), /* maximizeHoverEnabled= */ canOpenMaximizeMenu(animatingTaskResizeOrReposition))); @@ -1752,12 +1766,16 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin Context context, @NonNull Context userContext, DisplayController displayController, + @NonNull WindowDecorTaskResourceLoader appResourceProvider, SplitScreenController splitScreenController, DesktopUserRepositories desktopUserRepositories, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, - Handler handler, + @ShellMainThread Handler handler, + @ShellMainThread ShellExecutor mainExecutor, + @ShellMainThread MainCoroutineDispatcher mainDispatcher, + @ShellBackgroundThread CoroutineScope bgScope, @ShellBackgroundThread ShellExecutor bgExecutor, Choreographer choreographer, SyncTransactionQueue syncQueue, @@ -1774,12 +1792,16 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin context, userContext, displayController, + appResourceProvider, splitScreenController, desktopUserRepositories, taskOrganizer, taskInfo, taskSurface, handler, + mainExecutor, + mainDispatcher, + bgScope, bgExecutor, choreographer, syncQueue, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt index 1179b0cd226c..159759ede368 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt @@ -47,15 +47,25 @@ import androidx.compose.ui.graphics.toArgb import androidx.core.view.isGone import com.android.window.flags.Flags import com.android.wm.shell.R +import com.android.wm.shell.shared.annotations.ShellBackgroundThread +import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.shared.split.SplitScreenConstants import com.android.wm.shell.splitscreen.SplitScreenController import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewContainer import com.android.wm.shell.windowdecor.common.DecorThemeUtil import com.android.wm.shell.windowdecor.common.calculateMenuPosition +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader import com.android.wm.shell.windowdecor.extension.isFullscreen import com.android.wm.shell.windowdecor.extension.isMultiWindow import com.android.wm.shell.windowdecor.extension.isPinned +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.MainCoroutineDispatcher +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** * Handle menu opened when the appropriate button is clicked on. @@ -66,11 +76,12 @@ import com.android.wm.shell.windowdecor.extension.isPinned * Additional Options: Miscellaneous functions including screenshot and closing task. */ class HandleMenu( + @ShellMainThread private val mainDispatcher: CoroutineDispatcher, + @ShellBackgroundThread private val bgScope: CoroutineScope, private val parentDecor: DesktopModeWindowDecoration, private val windowManagerWrapper: WindowManagerWrapper, + private val taskResourceLoader: WindowDecorTaskResourceLoader, private val layoutResId: Int, - private val appIconBitmap: Bitmap?, - private val appName: CharSequence?, private val splitScreenController: SplitScreenController, private val shouldShowWindowingPill: Boolean, private val shouldShowNewWindowButton: Boolean, @@ -103,7 +114,8 @@ class HandleMenu( @VisibleForTesting var handleMenuViewContainer: AdditionalViewContainer? = null - private var handleMenuView: HandleMenuView? = null + @VisibleForTesting + var handleMenuView: HandleMenuView? = null // Position of the handle menu used for laying out the handle view. @VisibleForTesting @@ -122,6 +134,8 @@ class HandleMenu( get() = SHOULD_SHOW_SCREENSHOT_BUTTON || shouldShowNewWindowButton || shouldShowManageWindowsButton || shouldShowChangeAspectRatioButton + private var loadAppInfoJob: Job? = null + init { updateHandleMenuPillPositions(captionX, captionY) } @@ -190,7 +204,7 @@ class HandleMenu( shouldShowDesktopModeButton = shouldShowDesktopModeButton, isBrowserApp = isBrowserApp ).apply { - bind(taskInfo, appIconBitmap, appName, shouldShowMoreActionsPill) + bind(taskInfo, shouldShowMoreActionsPill) this.onToDesktopClickListener = onToDesktopClickListener this.onToFullscreenClickListener = onToFullscreenClickListener this.onToSplitScreenClickListener = onToSplitScreenClickListener @@ -204,7 +218,16 @@ class HandleMenu( this.onCloseMenuClickListener = onCloseMenuClickListener this.onOutsideTouchListener = onOutsideTouchListener } - + loadAppInfoJob = bgScope.launch { + if (!isActive) return@launch + val name = taskResourceLoader.getName(taskInfo) + val icon = taskResourceLoader.getHeaderIcon(taskInfo) + withContext(mainDispatcher) { + if (!isActive) return@withContext + handleMenuView.setAppName(name) + handleMenuView.setAppIcon(icon) + } + } val x = handleMenuPosition.x.toInt() val y = handleMenuPosition.y.toInt() handleMenuViewContainer = @@ -412,6 +435,7 @@ class HandleMenu( resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL fun close() { + loadAppInfoJob?.cancel() handleMenuView?.animateCloseMenu { handleMenuViewContainer?.releaseView() handleMenuViewContainer = null @@ -439,8 +463,10 @@ class HandleMenu( private val appInfoPill = rootView.requireViewById<View>(R.id.app_info_pill) private val collapseMenuButton = appInfoPill.requireViewById<HandleMenuImageButton>( R.id.collapse_menu_button) - private val appIconView = appInfoPill.requireViewById<ImageView>(R.id.application_icon) - private val appNameView = appInfoPill.requireViewById<TextView>(R.id.application_name) + @VisibleForTesting + val appIconView = appInfoPill.requireViewById<ImageView>(R.id.application_icon) + @VisibleForTesting + val appNameView = appInfoPill.requireViewById<TextView>(R.id.application_name) // Windowing Pill. private val windowingPill = rootView.requireViewById<View>(R.id.windowing_pill) @@ -509,14 +535,12 @@ class HandleMenu( /** Binds the menu views to the new data. */ fun bind( taskInfo: RunningTaskInfo, - appIconBitmap: Bitmap?, - appName: CharSequence?, shouldShowMoreActionsPill: Boolean ) { this.taskInfo = taskInfo this.style = calculateMenuStyle(taskInfo) - bindAppInfoPill(style, appIconBitmap, appName) + bindAppInfoPill(style) if (shouldShowWindowingPill) { bindWindowingPill(style) } @@ -527,6 +551,16 @@ class HandleMenu( bindOpenInAppOrBrowserPill(style) } + /** Sets the app's name. */ + fun setAppName(name: CharSequence) { + appNameView.text = name + } + + /** Sets the app's icon. */ + fun setAppIcon(icon: Bitmap) { + appIconView.setImageBitmap(icon) + } + /** Animates the menu openInAppOrBrowserg. */ fun animateOpenMenu() { if (taskInfo.isFullscreen || taskInfo.isMultiWindow) { @@ -593,22 +627,14 @@ class HandleMenu( ) } - private fun bindAppInfoPill( - style: MenuStyle, - appIconBitmap: Bitmap?, - appName: CharSequence? - ) { + private fun bindAppInfoPill(style: MenuStyle) { appInfoPill.background.setTint(style.backgroundColor) collapseMenuButton.apply { imageTintList = ColorStateList.valueOf(style.textColor) this.taskInfo = this@HandleMenuView.taskInfo } - appIconView.setImageBitmap(appIconBitmap) - appNameView.apply { - text = appName - setTextColor(style.textColor) - } + appNameView.setTextColor(style.textColor) } private fun bindWindowingPill(style: MenuStyle) { @@ -698,11 +724,12 @@ class HandleMenu( /** A factory interface to create a [HandleMenu]. */ interface HandleMenuFactory { fun create( + @ShellMainThread mainDispatcher: MainCoroutineDispatcher, + @ShellBackgroundThread bgScope: CoroutineScope, parentDecor: DesktopModeWindowDecoration, windowManagerWrapper: WindowManagerWrapper, + taskResourceLoader: WindowDecorTaskResourceLoader, layoutResId: Int, - appIconBitmap: Bitmap?, - appName: CharSequence?, splitScreenController: SplitScreenController, shouldShowWindowingPill: Boolean, shouldShowNewWindowButton: Boolean, @@ -721,11 +748,12 @@ interface HandleMenuFactory { /** A [HandleMenuFactory] implementation that creates a [HandleMenu]. */ object DefaultHandleMenuFactory : HandleMenuFactory { override fun create( + @ShellMainThread mainDispatcher: MainCoroutineDispatcher, + @ShellBackgroundThread bgScope: CoroutineScope, parentDecor: DesktopModeWindowDecoration, windowManagerWrapper: WindowManagerWrapper, + taskResourceLoader: WindowDecorTaskResourceLoader, layoutResId: Int, - appIconBitmap: Bitmap?, - appName: CharSequence?, splitScreenController: SplitScreenController, shouldShowWindowingPill: Boolean, shouldShowNewWindowButton: Boolean, @@ -740,11 +768,12 @@ object DefaultHandleMenuFactory : HandleMenuFactory { captionY: Int, ): HandleMenu { return HandleMenu( + mainDispatcher, + bgScope, parentDecor, windowManagerWrapper, + taskResourceLoader, layoutResId, - appIconBitmap, - appName, splitScreenController, shouldShowWindowingPill, shouldShowNewWindowButton, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt index 11a7cf8da8d8..cc54d25b3639 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt @@ -63,7 +63,7 @@ import com.android.wm.shell.R import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.SyncTransactionQueue -import com.android.wm.shell.desktopmode.calculateMaximizeBounds +import com.android.wm.shell.desktopmode.isTaskMaximized import com.android.wm.shell.shared.animation.Interpolators.EMPHASIZED_DECELERATE import com.android.wm.shell.shared.animation.Interpolators.FAST_OUT_LINEAR_IN import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer @@ -231,11 +231,7 @@ class MaximizeMenu( } private fun getSizeToggleDirection(): MaximizeMenuView.SizeToggleDirection { - val maximizeBounds = calculateMaximizeBounds( - displayController.getDisplayLayout(taskInfo.displayId)!!, - taskInfo - ) - val maximized = taskInfo.configuration.windowConfiguration.bounds.equals(maximizeBounds) + val maximized = isTaskMaximized(taskInfo, displayController) return if (maximized) MaximizeMenuView.SizeToggleDirection.RESTORE else diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt index 8770d35cb85c..96839ce47725 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt @@ -20,7 +20,6 @@ import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.app.ActivityManager.RunningTaskInfo import android.content.Context -import android.graphics.Bitmap import android.graphics.Color import android.graphics.PixelFormat import android.graphics.PointF @@ -38,13 +37,23 @@ import android.window.TaskConstants import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.ui.graphics.toArgb +import com.android.internal.annotations.VisibleForTesting import com.android.wm.shell.R import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayController.OnDisplaysChangedListener +import com.android.wm.shell.shared.annotations.ShellBackgroundThread +import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.windowdecor.WindowDecoration.SurfaceControlViewHostFactory +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader import com.android.wm.shell.windowdecor.common.DecorThemeUtil import com.android.wm.shell.windowdecor.common.Theme import java.util.function.Supplier +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** * Creates and updates a veil that covers task contents on resize. @@ -52,7 +61,9 @@ import java.util.function.Supplier public class ResizeVeil @JvmOverloads constructor( private val context: Context, private val displayController: DisplayController, - private val appIcon: Bitmap, + private val taskResourceLoader: WindowDecorTaskResourceLoader, + @ShellMainThread private val mainDispatcher: CoroutineDispatcher, + @ShellBackgroundThread private val bgScope: CoroutineScope, private var parentSurface: SurfaceControl, private val surfaceControlTransactionSupplier: Supplier<SurfaceControl.Transaction>, private val surfaceControlBuilderFactory: SurfaceControlBuilderFactory = @@ -65,7 +76,8 @@ public class ResizeVeil @JvmOverloads constructor( private val lightColors = dynamicLightColorScheme(context) private val darkColors = dynamicDarkColorScheme(context) - private lateinit var iconView: ImageView + @VisibleForTesting + lateinit var iconView: ImageView private var iconSize = 0 /** A container surface to host the veil background and icon child surfaces. */ @@ -77,6 +89,7 @@ public class ResizeVeil @JvmOverloads constructor( private var viewHost: SurfaceControlViewHost? = null private var display: Display? = null private var veilAnimator: ValueAnimator? = null + private var loadAppInfoJob: Job? = null /** * Whether the resize veil is currently visible. @@ -142,7 +155,6 @@ public class ResizeVeil @JvmOverloads constructor( val root = LayoutInflater.from(context) .inflate(R.layout.desktop_mode_resize_veil, null /* root */) iconView = root.requireViewById(R.id.veil_application_icon) - iconView.setImageBitmap(appIcon) val lp = WindowManager.LayoutParams( iconSize, iconSize, @@ -156,6 +168,14 @@ public class ResizeVeil @JvmOverloads constructor( iconSurface, null /* hostInputToken */) viewHost = surfaceControlViewHostFactory.create(context, display, wwm, "ResizeVeil") viewHost?.setView(root, lp) + loadAppInfoJob = bgScope.launch { + if (!isActive) return@launch + val icon = taskResourceLoader.getVeilIcon(taskInfo) + withContext(mainDispatcher) { + if (!isActive) return@withContext + iconView.setImageBitmap(icon) + } + } Trace.endSection() } @@ -401,6 +421,7 @@ public class ResizeVeil @JvmOverloads constructor( cancelAnimation() veilAnimator = null isVisible = false + loadAppInfoJob?.cancel() viewHost?.release() viewHost = null diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoader.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoader.kt new file mode 100644 index 000000000000..d87da092cccf --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoader.kt @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.wm.shell.windowdecor.common + +import android.annotation.DimenRes +import android.app.ActivityManager +import android.app.ActivityManager.RunningTaskInfo +import android.content.Context +import android.content.pm.ActivityInfo +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.os.UserHandle +import androidx.tracing.Trace +import com.android.internal.annotations.VisibleForTesting +import com.android.launcher3.icons.BaseIconFactory +import com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT +import com.android.launcher3.icons.IconProvider +import com.android.wm.shell.R +import com.android.wm.shell.shared.annotations.ShellBackgroundThread +import com.android.wm.shell.sysui.ShellCommandHandler +import com.android.wm.shell.sysui.ShellController +import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.sysui.UserChangeListener +import java.io.PrintWriter +import java.util.concurrent.ConcurrentHashMap + +/** + * A utility and cache for window decoration UI resources. + */ +class WindowDecorTaskResourceLoader( + private val context: Context, + shellInit: ShellInit, + private val shellController: ShellController, + private val shellCommandHandler: ShellCommandHandler, + private val iconProvider: IconProvider, + private val headerIconFactory: BaseIconFactory, + private val veilIconFactory: BaseIconFactory, +) { + constructor( + context: Context, + shellInit: ShellInit, + shellController: ShellController, + shellCommandHandler: ShellCommandHandler, + ) : this( + context, + shellInit, + shellController, + shellCommandHandler, + IconProvider(context), + headerIconFactory = context.createIconFactory(R.dimen.desktop_mode_caption_icon_radius), + veilIconFactory = context.createIconFactory(R.dimen.desktop_mode_resize_veil_icon_size), + ) + + /** + * A map of task -> resources to prevent unnecessary binder calls and resource loading + * when multiple window decorations need the same resources, for example, the app name or icon + * used in the header and menu. + */ + @VisibleForTesting + val taskToResourceCache = ConcurrentHashMap<Int, AppResources>() + /** + * Keeps track of existing tasks with a window decoration. Useful to verify that requests to + * get resources occur within the lifecycle of a window decoration, otherwise it'd be possible + * to load a tasks resources into memory without a future signal to clean up the resource. + * See [onWindowDecorClosed]. + */ + private val existingTasks = mutableSetOf<Int>() + + @VisibleForTesting + lateinit var currentUserContext: Context + + init { + shellInit.addInitCallback(this::onInit, this) + } + + private fun onInit() { + shellCommandHandler.addDumpCallback(this::dump, this) + shellController.addUserChangeListener(object : UserChangeListener { + override fun onUserChanged(newUserId: Int, userContext: Context) { + currentUserContext = userContext + // No need to hold on to resources for tasks of another profile. + taskToResourceCache.clear() + } + }) + currentUserContext = context.createContextAsUser( + UserHandle.of(ActivityManager.getCurrentUser()), /* flags= */ 0 + ) + } + + /** Returns the user readable name for this task. */ + @ShellBackgroundThread + fun getName(taskInfo: RunningTaskInfo): CharSequence { + checkWindowDecorExists(taskInfo) + val cachedResources = taskToResourceCache[taskInfo.taskId] + if (cachedResources != null) { + return cachedResources.appName + } + val resources = loadAppResources(taskInfo) + taskToResourceCache[taskInfo.taskId] = resources + return resources.appName + } + + /** Returns the icon for use by the app header and menus for this task. */ + @ShellBackgroundThread + fun getHeaderIcon(taskInfo: RunningTaskInfo): Bitmap { + checkWindowDecorExists(taskInfo) + val cachedResources = taskToResourceCache[taskInfo.taskId] + if (cachedResources != null) { + return cachedResources.appIcon + } + val resources = loadAppResources(taskInfo) + taskToResourceCache[taskInfo.taskId] = resources + return resources.appIcon + } + + /** Returns the icon for use by the resize veil for this task. */ + @ShellBackgroundThread + fun getVeilIcon(taskInfo: RunningTaskInfo): Bitmap { + checkWindowDecorExists(taskInfo) + val cachedResources = taskToResourceCache[taskInfo.taskId] + if (cachedResources != null) { + return cachedResources.veilIcon + } + val resources = loadAppResources(taskInfo) + taskToResourceCache[taskInfo.taskId] = resources + return resources.veilIcon + } + + /** Called when a window decoration for this task is created. */ + fun onWindowDecorCreated(taskInfo: RunningTaskInfo) { + existingTasks.add(taskInfo.taskId) + } + + /** Called when a window decoration for this task is closed. */ + fun onWindowDecorClosed(taskInfo: RunningTaskInfo) { + existingTasks.remove(taskInfo.taskId) + taskToResourceCache.remove(taskInfo.taskId) + } + + private fun checkWindowDecorExists(taskInfo: RunningTaskInfo) { + check(existingTasks.contains(taskInfo.taskId)) { + "Attempt to obtain resource for non-existent decoration" + } + } + + private fun loadAppResources(taskInfo: RunningTaskInfo): AppResources { + Trace.beginSection("$TAG#loadAppResources") + val pm = currentUserContext.packageManager + val activityInfo = getActivityInfo(taskInfo, pm) + val appName = pm.getApplicationLabel(activityInfo.applicationInfo) + val appIconDrawable = iconProvider.getIcon(activityInfo) + val badgedAppIconDrawable = pm.getUserBadgedIcon(appIconDrawable, taskInfo.userHandle()) + val appIcon = headerIconFactory.createIconBitmap(badgedAppIconDrawable, /* scale= */ 1f) + val veilIcon = veilIconFactory.createScaledBitmap(appIconDrawable, MODE_DEFAULT) + Trace.endSection() + return AppResources(appName = appName, appIcon = appIcon, veilIcon = veilIcon) + } + + private fun getActivityInfo(taskInfo: RunningTaskInfo, pm: PackageManager): ActivityInfo { + return pm.getActivityInfo(taskInfo.component(), /* flags= */ 0) + } + + private fun RunningTaskInfo.component() = baseIntent.component!! + + private fun RunningTaskInfo.userHandle() = UserHandle.of(userId) + + data class AppResources(val appName: CharSequence, val appIcon: Bitmap, val veilIcon: Bitmap) + + private fun dump(pw: PrintWriter, prefix: String) { + val innerPrefix = "$prefix " + pw.println("${prefix}$TAG") + pw.println(innerPrefix + "appResourceCache=$taskToResourceCache") + pw.println(innerPrefix + "existingTasks=$existingTasks") + } + + companion object { + private const val TAG = "AppResourceProvider" + } +} + +/** Creates an icon factory with the provided [dimensions]. */ +fun Context.createIconFactory(@DimenRes dimensions: Int): BaseIconFactory { + val densityDpi = resources.displayMetrics.densityDpi + val iconSize = resources.getDimensionPixelSize(dimensions) + return BaseIconFactory(this, densityDpi, iconSize) +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt index 9db69d5c1bc5..d72da3a08de5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt @@ -31,17 +31,23 @@ import com.android.wm.shell.common.DisplayChangeController import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.SyncTransactionQueue import com.android.wm.shell.desktopmode.DesktopModeEventLogger -import com.android.wm.shell.desktopmode.DesktopRepository import com.android.wm.shell.desktopmode.DesktopTasksController import com.android.wm.shell.desktopmode.DesktopUserRepositories import com.android.wm.shell.desktopmode.ReturnToDragStartAnimator import com.android.wm.shell.desktopmode.ToggleResizeDesktopTaskTransitionHandler +import com.android.wm.shell.shared.annotations.ShellBackgroundThread +import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.transition.Transitions import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainCoroutineDispatcher /** Manages tiling for each displayId/userId independently. */ class DesktopTilingDecorViewModel( private val context: Context, + @ShellMainThread private val mainDispatcher: MainCoroutineDispatcher, + @ShellBackgroundThread private val bgScope: CoroutineScope, private val displayController: DisplayController, private val rootTdaOrganizer: RootTaskDisplayAreaOrganizer, private val syncQueue: SyncTransactionQueue, @@ -51,6 +57,7 @@ class DesktopTilingDecorViewModel( private val returnToDragStartAnimator: ReturnToDragStartAnimator, private val desktopUserRepositories: DesktopUserRepositories, private val desktopModeEventLogger: DesktopModeEventLogger, + private val taskResourceLoader: WindowDecorTaskResourceLoader, ) : DisplayChangeController.OnDisplayChangingListener { @VisibleForTesting var tilingTransitionHandlerByDisplayId = SparseArray<DesktopTilingWindowDecoration>() @@ -74,8 +81,11 @@ class DesktopTilingDecorViewModel( val newHandler = DesktopTilingWindowDecoration( context, + mainDispatcher, + bgScope, syncQueue, displayController, + taskResourceLoader, displayId, rootTdaOrganizer, transitions, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt index 7ceac52dd2a1..6f2323347468 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt @@ -20,11 +20,9 @@ import android.app.ActivityManager.RunningTaskInfo import android.content.Context import android.content.res.Configuration import android.content.res.Resources -import android.graphics.Bitmap import android.graphics.Rect import android.os.IBinder import android.os.UserHandle -import android.util.Slog import android.view.MotionEvent import android.view.SurfaceControl import android.view.SurfaceControl.Transaction @@ -37,8 +35,6 @@ import android.window.TransitionRequestInfo import android.window.WindowContainerTransaction import com.android.internal.annotations.VisibleForTesting import com.android.launcher3.icons.BaseIconFactory -import com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT -import com.android.launcher3.icons.IconProvider import com.android.wm.shell.R import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.ShellTaskOrganizer @@ -47,11 +43,12 @@ import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.common.SyncTransactionQueue import com.android.wm.shell.desktopmode.DesktopModeEventLogger import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger -import com.android.wm.shell.desktopmode.DesktopRepository import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition import com.android.wm.shell.desktopmode.DesktopUserRepositories import com.android.wm.shell.desktopmode.ReturnToDragStartAnimator import com.android.wm.shell.desktopmode.ToggleResizeDesktopTaskTransitionHandler +import com.android.wm.shell.shared.annotations.ShellBackgroundThread +import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TRANSIT_MINIMIZE import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration @@ -60,13 +57,19 @@ import com.android.wm.shell.windowdecor.DragPositioningCallbackUtility.DragEvent import com.android.wm.shell.windowdecor.DragResizeWindowGeometry import com.android.wm.shell.windowdecor.DragResizeWindowGeometry.DisabledEdge.NONE import com.android.wm.shell.windowdecor.ResizeVeil +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader import com.android.wm.shell.windowdecor.extension.isFullscreen import java.util.function.Supplier +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainCoroutineDispatcher class DesktopTilingWindowDecoration( private var context: Context, + @ShellMainThread private val mainDispatcher: MainCoroutineDispatcher, + @ShellBackgroundThread private val bgScope: CoroutineScope, private val syncQueue: SyncTransactionQueue, private val displayController: DisplayController, + private val taskResourceLoader: WindowDecorTaskResourceLoader, private val displayId: Int, private val rootTdaOrganizer: RootTaskDisplayAreaOrganizer, private val transitions: Transitions, @@ -110,6 +113,9 @@ class DesktopTilingWindowDecoration( context, destinationBounds, displayController, + taskResourceLoader, + mainDispatcher, + bgScope, transactionSupplier, ) val isFirstTiledApp = leftTaskResizingHelper == null && rightTaskResizingHelper == null @@ -408,11 +414,13 @@ class DesktopTilingWindowDecoration( val context: Context, val bounds: Rect, val displayController: DisplayController, + private val taskResourceLoader: WindowDecorTaskResourceLoader, + @ShellMainThread val mainDispatcher: MainCoroutineDispatcher, + @ShellBackgroundThread val bgScope: CoroutineScope, val transactionSupplier: Supplier<Transaction>, ) { var isInitialised = false var newBounds = Rect(bounds) - private lateinit var resizeVeilBitmap: Bitmap private lateinit var resizeVeil: ResizeVeil private val displayContext = displayController.getDisplayContext(taskInfo.displayId) private val userContext = @@ -426,26 +434,14 @@ class DesktopTilingWindowDecoration( } private fun initVeil() { - val baseActivity = taskInfo.baseActivity - if (baseActivity == null) { - Slog.e(TAG, "Base activity component not found in task") - return - } - val resizeVeilIconFactory = - displayContext?.let { - createIconFactory(displayContext, R.dimen.desktop_mode_resize_veil_icon_size) - } ?: return - val pm = userContext.getPackageManager() - val activityInfo = pm.getActivityInfo(baseActivity, 0 /* flags */) - val provider = IconProvider(displayContext) - val appIconDrawable = provider.getIcon(activityInfo) - resizeVeilBitmap = - resizeVeilIconFactory.createScaledBitmap(appIconDrawable, MODE_DEFAULT) + displayContext ?: return resizeVeil = ResizeVeil( context = displayContext, displayController = displayController, - appIcon = resizeVeilBitmap, + taskResourceLoader = taskResourceLoader, + mainDispatcher = mainDispatcher, + bgScope = bgScope, parentSurface = desktopModeWindowDecoration.getLeash(), surfaceControlTransactionSupplier = transactionSupplier, taskInfo = taskInfo, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt index d94391820d05..dc4fa3788778 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt @@ -40,12 +40,12 @@ import androidx.compose.ui.graphics.toArgb import androidx.core.content.withStyledAttributes import androidx.core.view.isGone import androidx.core.view.isVisible -import com.android.internal.R.attr.materialColorOnSecondaryContainer -import com.android.internal.R.attr.materialColorOnSurface -import com.android.internal.R.attr.materialColorSecondaryContainer -import com.android.internal.R.attr.materialColorSurfaceContainerHigh -import com.android.internal.R.attr.materialColorSurfaceContainerLow -import com.android.internal.R.attr.materialColorSurfaceDim +import com.android.internal.R.color.materialColorOnSecondaryContainer +import com.android.internal.R.color.materialColorOnSurface +import com.android.internal.R.color.materialColorSecondaryContainer +import com.android.internal.R.color.materialColorSurfaceContainerHigh +import com.android.internal.R.color.materialColorSurfaceContainerLow +import com.android.internal.R.color.materialColorSurfaceDim import com.android.window.flags.Flags import com.android.window.flags.Flags.enableMinimizeButton import com.android.wm.shell.R @@ -72,14 +72,12 @@ class AppHeaderViewHolder( onCaptionButtonClickListener: View.OnClickListener, private val onLongClickListener: OnLongClickListener, onCaptionGenericMotionListener: View.OnGenericMotionListener, - appName: CharSequence, - appIconBitmap: Bitmap, onMaximizeHoverAnimationFinishedListener: () -> Unit ) : WindowDecorationViewHolder<AppHeaderViewHolder.HeaderData>(rootView) { data class HeaderData( val taskInfo: RunningTaskInfo, - val isRequestingImmersive: Boolean, + val isTaskMaximized: Boolean, val inFullImmersiveState: Boolean, val hasGlobalFocus: Boolean, val enableMaximizeLongClick: Boolean, @@ -154,8 +152,6 @@ class AppHeaderViewHolder( closeWindowButton.setOnTouchListener(onCaptionTouchListener) minimizeWindowButton.setOnClickListener(onCaptionButtonClickListener) minimizeWindowButton.setOnTouchListener(onCaptionTouchListener) - appNameTextView.text = appName - appIconImageView.setImageBitmap(appIconBitmap) maximizeButtonView.onHoverAnimationFinishedListener = onMaximizeHoverAnimationFinishedListener } @@ -163,16 +159,26 @@ class AppHeaderViewHolder( override fun bindData(data: HeaderData) { bindData( data.taskInfo, - data.isRequestingImmersive, + data.isTaskMaximized, data.inFullImmersiveState, data.hasGlobalFocus, data.enableMaximizeLongClick ) } + /** Sets the app's name in the header. */ + fun setAppName(name: CharSequence) { + appNameTextView.text = name + } + + /** Sets the app's icon in the header. */ + fun setAppIcon(icon: Bitmap) { + appIconImageView.setImageBitmap(icon) + } + private fun bindData( taskInfo: RunningTaskInfo, - isRequestingImmersive: Boolean, + isTaskMaximized: Boolean, inFullImmersiveState: Boolean, hasGlobalFocus: Boolean, enableMaximizeLongClick: Boolean, @@ -180,7 +186,7 @@ class AppHeaderViewHolder( if (DesktopModeFlags.ENABLE_THEMED_APP_HEADERS.isTrue()) { bindDataWithThemedHeaders( taskInfo, - isRequestingImmersive, + isTaskMaximized, inFullImmersiveState, hasGlobalFocus, enableMaximizeLongClick, @@ -225,7 +231,7 @@ class AppHeaderViewHolder( private fun bindDataWithThemedHeaders( taskInfo: RunningTaskInfo, - requestingImmersive: Boolean, + isTaskMaximized: Boolean, inFullImmersiveState: Boolean, hasGlobalFocus: Boolean, enableMaximizeLongClick: Boolean, @@ -283,7 +289,7 @@ class AppHeaderViewHolder( drawableInsets = maximizeDrawableInsets ) ) - setIcon(getMaximizeButtonIcon(requestingImmersive, inFullImmersiveState)) + setIcon(getMaximizeButtonIcon(isTaskMaximized, inFullImmersiveState)) } // Close button. closeWindowButton.apply { @@ -358,34 +364,19 @@ class AppHeaderViewHolder( @DrawableRes private fun getMaximizeButtonIcon( - requestingImmersive: Boolean, + isTaskMaximized: Boolean, inFullImmersiveState: Boolean ): Int = when { - shouldShowEnterFullImmersiveIcon(requestingImmersive, inFullImmersiveState) -> { - R.drawable.decor_desktop_mode_immersive_button_dark - } - shouldShowExitFullImmersiveIcon(requestingImmersive, inFullImmersiveState) -> { - R.drawable.decor_desktop_mode_immersive_exit_button_dark + shouldShowExitFullImmersiveOrMaximizeIcon(isTaskMaximized, inFullImmersiveState) -> { + R.drawable.decor_desktop_mode_immersive_or_maximize_exit_button_dark } else -> R.drawable.decor_desktop_mode_maximize_button_dark } - private fun shouldShowEnterFullImmersiveIcon( - requestingImmersive: Boolean, + private fun shouldShowExitFullImmersiveOrMaximizeIcon( + isTaskMaximized: Boolean, inFullImmersiveState: Boolean - ): Boolean = Flags.enableFullyImmersiveInDesktop() - && requestingImmersive && !inFullImmersiveState - - private fun shouldShowExitFullImmersiveIcon( - requestingImmersive: Boolean, - inFullImmersiveState: Boolean - ): Boolean = isInFullImmersiveStateAndRequesting(requestingImmersive, inFullImmersiveState) - - private fun isInFullImmersiveStateAndRequesting( - requestingImmersive: Boolean, - inFullImmersiveState: Boolean - ): Boolean = Flags.enableFullyImmersiveInDesktop() - && requestingImmersive && inFullImmersiveState + ): Boolean = (Flags.enableFullyImmersiveInDesktop() && inFullImmersiveState) || isTaskMaximized private fun getHeaderStyle(header: Header): HeaderStyle { return HeaderStyle( @@ -595,33 +586,31 @@ class AppHeaderViewHolder( @ColorInt private fun getAppNameAndButtonColor(taskInfo: RunningTaskInfo, hasGlobalFocus: Boolean): Int { - val materialColorAttr = when { + val materialColor = context.getColor(when { taskInfo.isTransparentCaptionBarAppearance && taskInfo.isLightCaptionBarAppearance -> materialColorOnSecondaryContainer taskInfo.isTransparentCaptionBarAppearance && !taskInfo.isLightCaptionBarAppearance -> materialColorOnSurface isDarkMode() -> materialColorOnSurface else -> materialColorOnSecondaryContainer - } + }) val appDetailsOpacity = when { isDarkMode() && !hasGlobalFocus -> DARK_THEME_UNFOCUSED_OPACITY !isDarkMode() && !hasGlobalFocus -> LIGHT_THEME_UNFOCUSED_OPACITY else -> FOCUSED_OPACITY } - context.withStyledAttributes(null, intArrayOf(materialColorAttr), 0, 0) { - val color = getColor(0, 0) - return if (appDetailsOpacity == FOCUSED_OPACITY) { - color - } else { - Color.argb( - appDetailsOpacity, - Color.red(color), - Color.green(color), - Color.blue(color) - ) - } + + + return if (appDetailsOpacity == FOCUSED_OPACITY) { + materialColor + } else { + Color.argb( + appDetailsOpacity, + Color.red(materialColor), + Color.green(materialColor), + Color.blue(materialColor) + ) } - return 0 } private fun isDarkMode(): Boolean { @@ -645,8 +634,6 @@ class AppHeaderViewHolder( onCaptionButtonClickListener: View.OnClickListener, onLongClickListener: OnLongClickListener, onCaptionGenericMotionListener: View.OnGenericMotionListener, - appName: CharSequence, - appIconBitmap: Bitmap, onMaximizeHoverAnimationFinishedListener: () -> Unit, ): AppHeaderViewHolder = AppHeaderViewHolder( rootView, @@ -654,8 +641,6 @@ class AppHeaderViewHolder( onCaptionButtonClickListener, onLongClickListener, onCaptionGenericMotionListener, - appName, - appIconBitmap, onMaximizeHoverAnimationFinishedListener, ) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java index a2afd2c92d3d..47ee7bb20199 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java @@ -718,7 +718,7 @@ public class BackAnimationControllerTest extends ShellTestCase { tInfo = createTransitionInfo(TRANSIT_PREPARE_BACK_NAVIGATION, open); callback = mock(Transitions.TransitionFinishCallback.class); mBackTransitionHandler.startAnimation(mockBinder, tInfo, st, ft, callback); - verify(mBackTransitionHandler).handlePrepareTransition( + verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder), eq(tInfo), eq(st), eq(ft), eq(callback)); mBackTransitionHandler.mCloseTransitionRequested = true; TransitionInfo tInfo2 = createTransitionInfo(TRANSIT_CLOSE, close); @@ -750,7 +750,7 @@ public class BackAnimationControllerTest extends ShellTestCase { null /* remoteTransition */); mBackTransitionHandler.handleRequest(mockBinder, requestInfo); mBackTransitionHandler.startAnimation(mockBinder, tInfo, st, ft, callback); - verify(mBackTransitionHandler).handlePrepareTransition( + verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder), eq(tInfo), eq(st), eq(ft), eq(callback)); mBackTransitionHandler.onAnimationFinished(); @@ -801,7 +801,7 @@ public class BackAnimationControllerTest extends ShellTestCase { canHandle = mBackTransitionHandler.startAnimation(mockBinder, prepareInfo, st, ft, callback2); assertTrue("Handle prepare transition" , canHandle); - verify(mBackTransitionHandler).handlePrepareTransition( + verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder), eq(prepareInfo), eq(st), eq(ft), eq(callback2)); final TransitionInfo closeInfo = createTransitionInfo(TRANSIT_CLOSE, close); Transitions.TransitionFinishCallback mergeCallback = @@ -819,7 +819,7 @@ public class BackAnimationControllerTest extends ShellTestCase { canHandle = mBackTransitionHandler.startAnimation( mockBinder, prepareInfo, st, ft, callback3); assertTrue("Handle prepare transition" , canHandle); - verify(mBackTransitionHandler).handlePrepareTransition( + verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder), eq(prepareInfo), eq(st), eq(ft), eq(callback3)); final TransitionInfo.Change open2 = createAppChange( openTaskId2, TRANSIT_OPEN, FLAG_MOVED_TO_TOP); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java index b9490b881d08..e92e243172f7 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java @@ -78,7 +78,8 @@ public class PipAppOpsListenerTest { @Test public void onActivityPinned_registerAppOpsListener() { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); mPipAppOpsListener.onActivityPinned(packageName); @@ -89,7 +90,8 @@ public class PipAppOpsListenerTest { @Test public void onActivityUnpinned_unregisterAppOpsListener() { - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); mPipAppOpsListener.onActivityUnpinned(); @@ -99,7 +101,8 @@ public class PipAppOpsListenerTest { @Test public void disablePipAppOps_dismissPip() throws PackageManager.NameNotFoundException { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); // Set up the top pip activity info as mTopPipActivity mTopPipActivity = new Pair<>(new ComponentName(packageName, "PipActivity"), 0); mPipAppOpsListener.setTopPipActivityInfoSupplier(this::getTopPipActivity); @@ -131,7 +134,8 @@ public class PipAppOpsListenerTest { public void disablePipAppOps_differentPackage_doNothing() throws PackageManager.NameNotFoundException { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); // Set up the top pip activity info as mTopPipActivity mTopPipActivity = new Pair<>(new ComponentName(packageName, "PipActivity"), 0); mPipAppOpsListener.setTopPipActivityInfoSupplier(this::getTopPipActivity); @@ -160,7 +164,8 @@ public class PipAppOpsListenerTest { public void disablePipAppOps_nameNotFound_unregisterAppOpsListener() throws PackageManager.NameNotFoundException { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); // Set up the top pip activity info as mTopPipActivity mTopPipActivity = new Pair<>(new ComponentName(packageName, "PipActivity"), 0); mPipAppOpsListener.setTopPipActivityInfoSupplier(this::getTopPipActivity); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS index 5b05af9b0a74..3a017f38f3ea 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS @@ -1,2 +1,8 @@ # Bug component: 970984 -# includes OWNERS from parent directories
\ No newline at end of file +# includes OWNERS from parent directories + +mariiasand@google.com +mcarli@google.com +minagranic@google.com +gracielawputri@google.com +eevlachavas@google.com
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt index 95a0c82c76df..88cc981dd30c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt @@ -16,10 +16,8 @@ package com.android.wm.shell.compatui.letterbox -import android.content.Context import android.graphics.Rect import android.view.SurfaceControl -import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode import org.mockito.kotlin.any import org.mockito.kotlin.clearInvocations @@ -31,10 +29,7 @@ import org.mockito.kotlin.verify /** * Robot to test [LetterboxController] implementations. */ -open class LetterboxControllerRobotTest( - ctx: Context, - controllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController -) { +abstract class LetterboxControllerRobotTest { companion object { @JvmStatic @@ -44,21 +39,21 @@ open class LetterboxControllerRobotTest( private val TASK_ID = 20 } - private val letterboxConfiguration: LetterboxConfiguration - private val surfaceBuilder: LetterboxSurfaceBuilder - private val letterboxController: LetterboxController - private val transaction: SurfaceControl.Transaction - private val parentLeash: SurfaceControl + lateinit var letterboxController: LetterboxController + val transaction: SurfaceControl.Transaction + val parentLeash: SurfaceControl init { - letterboxConfiguration = LetterboxConfiguration(ctx) - surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration) - letterboxController = controllerBuilder(surfaceBuilder) transaction = getTransactionMock() parentLeash = mock<SurfaceControl>() - spyOn(surfaceBuilder) } + fun initController() { + letterboxController = buildController() + } + + abstract fun buildController(): LetterboxController + fun sendCreateSurfaceRequest( displayId: Int = DISPLAY_ID, taskId: Int = TASK_ID @@ -102,16 +97,6 @@ open class LetterboxControllerRobotTest( letterboxController.dump() } - fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") { - verify(surfaceBuilder, times(times)).createSurface( - eq(transaction), - eq(parentLeash), - name.asAnyMode(), - callSite.asAnyMode(), - any() - ) - } - fun checkTransactionRemovedInvoked(times: Int = 1) { verify(transaction, times(times)).remove(any()) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt index 667511288bfa..dd4cb1185b31 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt @@ -16,7 +16,6 @@ package com.android.wm.shell.compatui.letterbox -import android.content.Context import android.graphics.Rect import android.testing.AndroidTestingRunner import android.view.SurfaceControl @@ -44,24 +43,14 @@ import org.mockito.kotlin.verify @SmallTest class LetterboxUtilsTest : ShellTestCase() { - val firstLetterboxController = mock<LetterboxController>() - val secondLetterboxController = mock<LetterboxController>() - val thirdLetterboxController = mock<LetterboxController>() - - private val letterboxControllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController = - { _ -> - firstLetterboxController.append(secondLetterboxController) - .append(thirdLetterboxController) - } - @Test fun `Appended LetterboxController invoked creation on all the controllers`() { runTestScenario { r -> r.sendCreateSurfaceRequest() - r.verifyCreateSurfaceInvokedWithRequest(target = firstLetterboxController) - r.verifyCreateSurfaceInvokedWithRequest(target = secondLetterboxController) - r.verifyCreateSurfaceInvokedWithRequest(target = thirdLetterboxController) + r.verifyCreateSurfaceInvokedWithRequest(target = r.firstLetterboxController) + r.verifyCreateSurfaceInvokedWithRequest(target = r.secondLetterboxController) + r.verifyCreateSurfaceInvokedWithRequest(target = r.thirdLetterboxController) } } @@ -69,9 +58,9 @@ class LetterboxUtilsTest : ShellTestCase() { fun `Appended LetterboxController invoked destroy on all the controllers`() { runTestScenario { r -> r.sendDestroySurfaceRequest() - r.verifyDestroySurfaceInvokedWithRequest(target = firstLetterboxController) - r.verifyDestroySurfaceInvokedWithRequest(target = secondLetterboxController) - r.verifyDestroySurfaceInvokedWithRequest(target = thirdLetterboxController) + r.verifyDestroySurfaceInvokedWithRequest(target = r.firstLetterboxController) + r.verifyDestroySurfaceInvokedWithRequest(target = r.secondLetterboxController) + r.verifyDestroySurfaceInvokedWithRequest(target = r.thirdLetterboxController) } } @@ -79,9 +68,9 @@ class LetterboxUtilsTest : ShellTestCase() { fun `Appended LetterboxController invoked update visibility on all the controllers`() { runTestScenario { r -> r.sendUpdateSurfaceVisibilityRequest(visible = true) - r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = firstLetterboxController) - r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = secondLetterboxController) - r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = thirdLetterboxController) + r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.firstLetterboxController) + r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.secondLetterboxController) + r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.thirdLetterboxController) } } @@ -89,9 +78,9 @@ class LetterboxUtilsTest : ShellTestCase() { fun `Appended LetterboxController invoked update bounds on all the controllers`() { runTestScenario { r -> r.sendUpdateSurfaceBoundsRequest(taskBounds = Rect(), activityBounds = Rect()) - r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = firstLetterboxController) - r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = secondLetterboxController) - r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = thirdLetterboxController) + r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.firstLetterboxController) + r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.secondLetterboxController) + r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.thirdLetterboxController) } } @@ -99,9 +88,9 @@ class LetterboxUtilsTest : ShellTestCase() { fun `Appended LetterboxController invoked update dump on all the controllers`() { runTestScenario { r -> r.invokeDump() - r.verifyDumpInvoked(target = firstLetterboxController) - r.verifyDumpInvoked(target = secondLetterboxController) - r.verifyDumpInvoked(target = thirdLetterboxController) + r.verifyDumpInvoked(target = r.firstLetterboxController) + r.verifyDumpInvoked(target = r.secondLetterboxController) + r.verifyDumpInvoked(target = r.thirdLetterboxController) } } @@ -138,21 +127,20 @@ class LetterboxUtilsTest : ShellTestCase() { * Runs a test scenario providing a Robot. */ fun runTestScenario(consumer: Consumer<AppendLetterboxControllerRobotTest>) { - val robot = AppendLetterboxControllerRobotTest(mContext, letterboxControllerBuilder) - consumer.accept(robot) + consumer.accept(AppendLetterboxControllerRobotTest().apply { initController() }) } - class AppendLetterboxControllerRobotTest( - ctx: Context, - builder: (LetterboxSurfaceBuilder) -> LetterboxController - ) : LetterboxControllerRobotTest(ctx, builder) { + class AppendLetterboxControllerRobotTest : LetterboxControllerRobotTest() { + + val firstLetterboxController = mock<LetterboxController>() + val secondLetterboxController = mock<LetterboxController>() + val thirdLetterboxController = mock<LetterboxController>() private var testableMap = mutableMapOf<Int, Int>() private var onItemState: Int? = null private var onMissingStateKey: Int? = null private var onMissingStateMap: MutableMap<Int, Int>? = null - private val transaction = getTransactionMock() private val surface = SurfaceControl() fun verifyCreateSurfaceInvokedWithRequest( @@ -230,5 +218,9 @@ class LetterboxUtilsTest : ShellTestCase() { fun verifySetWindowCrop(expectedWidth: Int, expectedHeight: Int) { verify(transaction).setWindowCrop(surface, expectedWidth, expectedHeight) } + + override fun buildController(): LetterboxController = + firstLetterboxController.append(secondLetterboxController) + .append(thirdLetterboxController) } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt index e6bff4c1ec15..3b72ff1cac71 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt @@ -16,7 +16,6 @@ package com.android.wm.shell.compatui.letterbox -import android.content.Context import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.wm.shell.ShellTestCase @@ -64,65 +63,48 @@ class MixedLetterboxControllerTest : ShellTestCase() { * Runs a test scenario providing a Robot. */ fun runTestScenario(consumer: Consumer<MixedLetterboxControllerRobotTest>) { - val robot = MixedLetterboxControllerRobotTest(mContext, ObjectToTestHolder()) - consumer.accept(robot) + consumer.accept(MixedLetterboxControllerRobotTest().apply { initController() }) } - class MixedLetterboxControllerRobotTest( - ctx: Context, - private val objectToTestHolder: ObjectToTestHolder - ) : LetterboxControllerRobotTest(ctx, objectToTestHolder.controllerBuilder) { + class MixedLetterboxControllerRobotTest : LetterboxControllerRobotTest() { + val singleLetterboxController: SingleSurfaceLetterboxController = + mock<SingleSurfaceLetterboxController>() + val multipleLetterboxController: MultiSurfaceLetterboxController = + mock<MultiSurfaceLetterboxController>() + val controllerStrategy: LetterboxControllerStrategy = mock<LetterboxControllerStrategy>() fun configureStrategyFor(letterboxMode: LetterboxMode) { - doReturn(letterboxMode).`when`(objectToTestHolder.controllerStrategy) - .getLetterboxImplementationMode() + doReturn(letterboxMode).`when`(controllerStrategy).getLetterboxImplementationMode() } fun checkCreateInvokedOnSingleController(times: Int = 1) { - verify( - objectToTestHolder.singleLetterboxController, - times(times) - ).createLetterboxSurface(any(), any(), any()) + verify(singleLetterboxController, times(times)).createLetterboxSurface( + any(), + any(), + any() + ) } fun checkCreateInvokedOnMultiController(times: Int = 1) { - verify( - objectToTestHolder.multipleLetterboxController, - times(times) - ).createLetterboxSurface(any(), any(), any()) + verify(multipleLetterboxController, times(times)).createLetterboxSurface( + any(), + any(), + any() + ) } fun checkDestroyInvokedOnSingleController(times: Int = 1) { - verify( - objectToTestHolder.singleLetterboxController, - times(times) - ).destroyLetterboxSurface(any(), any()) + verify(singleLetterboxController, times(times)).destroyLetterboxSurface(any(), any()) } fun checkDestroyInvokedOnMultiController(times: Int = 1) { - verify( - objectToTestHolder.multipleLetterboxController, - times(times) - ).destroyLetterboxSurface(any(), any()) + verify(multipleLetterboxController, times(times)).destroyLetterboxSurface(any(), any()) } - } - - data class ObjectToTestHolder( - val singleLetterboxController: SingleSurfaceLetterboxController = - mock<SingleSurfaceLetterboxController>(), - val multipleLetterboxController: MultiSurfaceLetterboxController = - mock<MultiSurfaceLetterboxController>(), - val controllerStrategy: LetterboxControllerStrategy = mock<LetterboxControllerStrategy>() - ) { - - private val mixedController = - MixedLetterboxController( - singleLetterboxController, - multipleLetterboxController, - controllerStrategy - ) - val controllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController = - { _ -> mixedController } + override fun buildController(): LetterboxController = MixedLetterboxController( + singleLetterboxController, + multipleLetterboxController, + controllerStrategy + ) } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt index 295d4edf206b..3fd837db478c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt @@ -16,13 +16,20 @@ package com.android.wm.shell.compatui.letterbox +import android.content.Context import android.graphics.Rect import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest +import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode import java.util.function.Consumer import org.junit.Test import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.times +import org.mockito.kotlin.verify /** * Tests for [MultiSurfaceLetterboxController]. @@ -147,9 +154,33 @@ class MultiSurfaceLetterboxControllerTest : ShellTestCase() { /** * Runs a test scenario providing a Robot. */ - fun runTestScenario(consumer: Consumer<LetterboxControllerRobotTest>) { - val robot = - LetterboxControllerRobotTest(mContext, { sb -> MultiSurfaceLetterboxController(sb) }) - consumer.accept(robot) + fun runTestScenario(consumer: Consumer<MultiLetterboxControllerRobotTest>) { + consumer.accept(MultiLetterboxControllerRobotTest(mContext).apply { initController() }) + } + + class MultiLetterboxControllerRobotTest(context: Context) : + LetterboxControllerRobotTest() { + + private val letterboxConfiguration: LetterboxConfiguration + private val surfaceBuilder: LetterboxSurfaceBuilder + + init { + letterboxConfiguration = LetterboxConfiguration(context) + surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration) + spyOn(surfaceBuilder) + } + + override fun buildController(): LetterboxController = + MultiSurfaceLetterboxController(surfaceBuilder) + + fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") { + verify(surfaceBuilder, times(times)).createSurface( + eq(transaction), + eq(parentLeash), + name.asAnyMode(), + callSite.asAnyMode(), + any() + ) + } } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt index 125e700bcd42..e6ffe98875ed 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt @@ -16,13 +16,20 @@ package com.android.wm.shell.compatui.letterbox +import android.content.Context import android.graphics.Rect import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest +import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode import java.util.function.Consumer import org.junit.Test import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.times +import org.mockito.kotlin.verify /** * Tests for [SingleSurfaceLetterboxController]. @@ -120,9 +127,33 @@ class SingleSurfaceLetterboxControllerTest : ShellTestCase() { /** * Runs a test scenario providing a Robot. */ - fun runTestScenario(consumer: Consumer<LetterboxControllerRobotTest>) { - val robot = - LetterboxControllerRobotTest(mContext, { sb -> SingleSurfaceLetterboxController(sb) }) - consumer.accept(robot) + fun runTestScenario(consumer: Consumer<SingleLetterboxControllerRobotTest>) { + consumer.accept(SingleLetterboxControllerRobotTest(mContext).apply { initController() }) + } + + class SingleLetterboxControllerRobotTest(context: Context) : + LetterboxControllerRobotTest() { + + private val letterboxConfiguration: LetterboxConfiguration + private val surfaceBuilder: LetterboxSurfaceBuilder + + init { + letterboxConfiguration = LetterboxConfiguration(context) + surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration) + spyOn(surfaceBuilder) + } + + override fun buildController(): LetterboxController = + SingleSurfaceLetterboxController(surfaceBuilder) + + fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") { + verify(surfaceBuilder, times(times)).createSurface( + eq(transaction), + eq(parentLeash), + name.asAnyMode(), + callSite.asAnyMode(), + any() + ) + } } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt index 41a594a3347a..4cc641cd1d81 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt @@ -36,6 +36,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito.never import com.android.dx.mockito.inline.extended.StaticMockitoSession import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE import com.android.window.flags.Flags.FLAG_RESPECT_ORIENTATION_CHANGE_FOR_UNRESIZEABLE +import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase import com.android.wm.shell.common.ShellExecutor @@ -98,6 +99,7 @@ class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() { @Mock lateinit var persistentRepository: DesktopPersistentRepository @Mock lateinit var repositoryInitializer: DesktopRepositoryInitializer @Mock lateinit var userManager: UserManager + @Mock lateinit var shellController: ShellController private lateinit var mockitoSession: StaticMockitoSession private lateinit var handler: DesktopActivityOrientationChangeHandler @@ -123,6 +125,7 @@ class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() { DesktopUserRepositories( context, shellInit, + shellController, persistentRepository, repositoryInitializer, testScope, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt index db4c7465ae48..b87f20023796 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt @@ -42,6 +42,7 @@ import com.android.wm.shell.ShellTestCase import com.android.wm.shell.TestShellExecutor import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout +import com.android.wm.shell.desktopmode.DesktopImmersiveController.Direction import com.android.wm.shell.desktopmode.DesktopImmersiveController.ExitReason.USER_INTERACTION import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask import com.android.wm.shell.sysui.ShellInit @@ -88,13 +89,15 @@ class DesktopImmersiveControllerTest : ShellTestCase() { @Before fun setUp() { userRepositories = DesktopUserRepositories( - context, ShellInit(TestShellExecutor()), mock(), mock(), mock(), mock() + context, ShellInit(TestShellExecutor()), mock(), mock(), mock(), mock(), mock() ) whenever(mockDisplayController.getDisplayLayout(DEFAULT_DISPLAY)) .thenReturn(mockDisplayLayout) whenever(mockDisplayLayout.getStableBounds(any())).thenAnswer { invocation -> (invocation.getArgument(0) as Rect).set(STABLE_BOUNDS) } + whenever(mockDisplayLayout.width()).thenReturn(DISPLAY_BOUNDS.width()) + whenever(mockDisplayLayout.height()).thenReturn(DISPLAY_BOUNDS.height()) controller = DesktopImmersiveController( shellInit = mock(), transitions = mockTransitions, @@ -277,10 +280,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() { controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY, USER_INTERACTION) - assertThat(controller.pendingExternalExitTransitions.any { exit -> - exit.transition == transition && exit.displayId == DEFAULT_DISPLAY - && exit.taskId == task.taskId - }).isTrue() + assertTransitionPending( + transition = transition, + taskId = task.taskId, + direction = Direction.EXIT, + animate = false + ) } @Test @@ -298,10 +303,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() { controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY, USER_INTERACTION) - assertThat(controller.pendingExternalExitTransitions.any { exit -> - exit.transition == transition && exit.displayId == DEFAULT_DISPLAY - && exit.taskId == task.taskId - }).isFalse() + assertTransitionNotPending( + transition = transition, + taskId = task.taskId, + direction = Direction.EXIT, + animate = false + ) } @Test @@ -360,10 +367,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() { reason = USER_INTERACTION, ).asExit()?.runOnTransitionStart?.invoke(transition) - assertThat(controller.pendingExternalExitTransitions.any { exit -> - exit.transition == transition && exit.displayId == DEFAULT_DISPLAY - && exit.taskId == task.taskId - }).isFalse() + assertTransitionNotPending( + transition = transition, + taskId = task.taskId, + animate = false, + direction = Direction.EXIT + ) } @Test @@ -416,10 +425,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() { controller.exitImmersiveIfApplicable(wct, task, USER_INTERACTION) .asExit()?.runOnTransitionStart?.invoke(transition) - assertThat(controller.pendingExternalExitTransitions.any { exit -> - exit.transition == transition && exit.displayId == DEFAULT_DISPLAY - && exit.taskId == task.taskId - }).isTrue() + assertTransitionPending( + transition = transition, + taskId = task.taskId, + direction = Direction.EXIT, + animate = false + ) } @Test @@ -481,10 +492,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() { ) controller.onTransitionFinished(transition, aborted = false) - assertThat(controller.pendingExternalExitTransitions.any { exit -> - exit.transition == transition && exit.displayId == DEFAULT_DISPLAY - && exit.taskId == task.taskId - }).isFalse() + assertTransitionNotPending( + transition = transition, + taskId = task.taskId, + direction = Direction.EXIT, + animate = false + ) } @Test @@ -513,14 +526,18 @@ class DesktopImmersiveControllerTest : ShellTestCase() { controller.onTransitionMerged(transition, mergedToTransition) controller.onTransitionFinished(mergedToTransition, aborted = false) - assertThat(controller.pendingExternalExitTransitions.any { exit -> - exit.transition == transition && exit.displayId == DEFAULT_DISPLAY - && exit.taskId == task.taskId - }).isFalse() - assertThat(controller.pendingExternalExitTransitions.any { exit -> - exit.transition == mergedToTransition && exit.displayId == DEFAULT_DISPLAY - && exit.taskId == task.taskId - }).isFalse() + assertTransitionNotPending( + transition = transition, + taskId = task.taskId, + animate = false, + direction = Direction.EXIT + ) + assertTransitionNotPending( + transition = mergedToTransition, + taskId = task.taskId, + animate = false, + direction = Direction.EXIT + ) } @Test @@ -686,7 +703,7 @@ class DesktopImmersiveControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) - fun externalAnimateResizeChange_doesNotCleanUpPendingTransitionState() { + fun externalAnimateResizeChange_doesNotRemovePendingTransition() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) @@ -709,12 +726,16 @@ class DesktopImmersiveControllerTest : ShellTestCase() { ) animatorTestRule.advanceTimeBy(DesktopImmersiveController.FULL_IMMERSIVE_ANIM_DURATION_MS) - assertThat(controller.state).isNotNull() + assertTransitionPending( + transition = mockBinder, + taskId = task.taskId, + direction = Direction.EXIT + ) } @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) - fun startAnimation_missingChange_clearsState() { + fun startAnimation_missingChange_removesPendingTransition() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) @@ -735,7 +756,42 @@ class DesktopImmersiveControllerTest : ShellTestCase() { finishCallback = {} ) - assertThat(controller.state).isNull() + assertTransitionNotPending( + transition = mockBinder, + taskId = task.taskId, + direction = Direction.ENTER + ) + } + + private fun assertTransitionPending( + transition: IBinder, + taskId: Int, + direction: Direction, + animate: Boolean = true, + displayId: Int = DEFAULT_DISPLAY + ) { + assertThat(controller.pendingImmersiveTransitions.any { pendingTransition -> + pendingTransition.transition == transition + && pendingTransition.displayId == displayId + && pendingTransition.taskId == taskId + && pendingTransition.animate == animate + && pendingTransition.direction == direction + }).isTrue() + } + + private fun assertTransitionNotPending( + transition: IBinder, + taskId: Int, + direction: Direction, + animate: Boolean = true, + displayId: Int = DEFAULT_DISPLAY + ) { + assertThat(controller.pendingImmersiveTransitions.any { pendingTransition -> + pendingTransition.transition == transition + && pendingTransition.displayId == displayId + && pendingTransition.taskId == taskId + && pendingTransition.direction == direction + }).isFalse() } private fun createTransitionInfo( @@ -768,5 +824,6 @@ class DesktopImmersiveControllerTest : ShellTestCase() { companion object { private val STABLE_BOUNDS = Rect(0, 100, 2000, 1900) + private val DISPLAY_BOUNDS = Rect(0, 0, 2000, 2000) } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 7c9494ce7026..0b12d228a0c2 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -81,6 +81,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito.never import com.android.dx.mockito.inline.extended.StaticMockitoSession import com.android.internal.jank.InteractionJankMonitor import com.android.window.flags.Flags +import com.android.window.flags.Flags.FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE import com.android.window.flags.Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP import com.android.wm.shell.MockToken @@ -276,6 +277,7 @@ class DesktopTasksControllerTest : ShellTestCase() { DesktopUserRepositories( context, shellInit, + shellController, persistentRepository, repositoryInitializer, testScope, @@ -1217,14 +1219,40 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test - fun moveRunningTaskToDesktop_deviceSupported_taskIsMovedToDesktop() { - val task = setUpFullscreenTask() + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) + fun moveBackgroundTaskToDesktop_remoteTransition_usesOneShotHandler() { + val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) + whenever( + transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture()) + ).thenReturn(Binder()) - controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN) + val task = createTaskInfo(1) + whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) + whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) + controller.moveTaskToDesktop( + taskId = task.taskId, + transitionSource = UNKNOWN, + remoteTransition = RemoteTransition(spy(TestRemoteTransition()))) + + verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) + assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) + } + + + @Test + fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() { + val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) + whenever( + transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture()) + ).thenReturn(Binder()) + + controller.moveRunningTaskToDesktop( + task = setUpFullscreenTask(), + transitionSource = UNKNOWN, + remoteTransition = RemoteTransition(spy(TestRemoteTransition()))) - val wct = getLatestEnterDesktopWct() - assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM) verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) + assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) } @Test @@ -1598,6 +1626,30 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test + @EnableFlags(FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY) + fun moveToNextDisplay_removeWallpaper() { + // Set up two display ids + whenever(rootTaskDisplayAreaOrganizer.displayIds) + .thenReturn(intArrayOf(DEFAULT_DISPLAY, SECOND_DISPLAY)) + // Create a mock for the target display area: second display + val secondDisplayArea = DisplayAreaInfo(MockToken().token(), SECOND_DISPLAY, 0) + whenever(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(SECOND_DISPLAY)) + .thenReturn(secondDisplayArea) + // Add a task and a wallpaper + val task = setUpFreeformTask(displayId = DEFAULT_DISPLAY) + val wallpaperToken = MockToken().token() + taskRepository.wallpaperActivityToken = wallpaperToken + + controller.moveToNextDisplay(task.taskId) + + with(getLatestWct(type = TRANSIT_CHANGE)) { + val wallpaperChange = hierarchyOps.find { op -> op.container == wallpaperToken.asBinder() } + assertThat(wallpaperChange).isNotNull() + assertThat(wallpaperChange!!.type).isEqualTo(HIERARCHY_OP_TYPE_REMOVE_TASK) + } + } + + @Test fun getTaskWindowingMode() { val fullscreenTask = setUpFullscreenTask() val freeformTask = setUpFreeformTask() @@ -3881,7 +3933,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun shellController_registersUserChangeListener() { - verify(shellController, times(1)).addUserChangeListener(any()) + verify(shellController, times(2)).addUserChangeListener(any()) } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt index 0712d58166bb..39178cb2cd25 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt @@ -42,6 +42,7 @@ import com.android.internal.jank.InteractionJankMonitor import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository @@ -96,6 +97,7 @@ class DesktopTasksLimiterTest : ShellTestCase() { @Mock lateinit var persistentRepository: DesktopPersistentRepository @Mock lateinit var repositoryInitializer: DesktopRepositoryInitializer @Mock lateinit var userManager: UserManager + @Mock lateinit var shellController: ShellController private lateinit var mockitoSession: StaticMockitoSession private lateinit var desktopTasksLimiter: DesktopTasksLimiter @@ -117,6 +119,7 @@ class DesktopTasksLimiterTest : ShellTestCase() { DesktopUserRepositories( context, shellInit, + shellController, persistentRepository, repositoryInitializer, testScope, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt index 5767df4c5a8e..a2e939d86adb 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt @@ -24,14 +24,15 @@ import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest -import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn +import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.dx.mockito.inline.extended.StaticMockitoSession import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_HSUM import com.android.wm.shell.ShellTestCase import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository import com.android.wm.shell.desktopmode.persistence.DesktopRepositoryInitializer +import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.sysui.ShellInit import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope @@ -66,6 +67,7 @@ class DesktopUserRepositoriesTest : ShellTestCase() { private val persistentRepository = mock<DesktopPersistentRepository>() private val repositoryInitializer = mock<DesktopRepositoryInitializer>() private val userManager = mock<UserManager>() + private val shellController = mock<ShellController>() @Before fun setUp() { @@ -86,8 +88,14 @@ class DesktopUserRepositoriesTest : ShellTestCase() { whenever(userManager.getProfiles(USER_ID_1)).thenReturn(profiles) userRepositories = DesktopUserRepositories( - context, shellInit, persistentRepository, repositoryInitializer, datastoreScope, - userManager) + context, + shellInit, + shellController, + persistentRepository, + repositoryInitializer, + datastoreScope, + userManager + ) } @After diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt index 1c88a290d677..cdf064b075a1 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt @@ -27,6 +27,7 @@ import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE import com.android.wm.shell.ShellTestCase import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.desktopmode.DesktopUserRepositories +import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.sysui.ShellInit import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope @@ -64,6 +65,7 @@ class DesktopRepositoryInitializerTest : ShellTestCase() { private val persistentRepository = mock<DesktopPersistentRepository>() private val userManager = mock<UserManager>() private val testExecutor = mock<ShellExecutor>() + private val shellController = mock<ShellController>() @Before fun setUp() { @@ -74,7 +76,12 @@ class DesktopRepositoryInitializerTest : ShellTestCase() { DesktopRepositoryInitializerImpl(context, persistentRepository, datastoreScope) desktopUserRepositories = DesktopUserRepositories( - context, shellInit, persistentRepository, repositoryInitializer, datastoreScope, + context, + shellInit, + shellController, + persistentRepository, + repositoryInitializer, + datastoreScope, userManager ) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java index bb9703fce2e3..bca9c3fdda39 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java @@ -106,6 +106,7 @@ public class SplitScreenControllerTests extends ShellTestCase { @Mock RootTaskDisplayAreaOrganizer mRootTDAOrganizer; @Mock ShellExecutor mMainExecutor; @Mock Handler mMainHandler; + @Mock ShellExecutor mBgExecutor; @Mock DisplayController mDisplayController; @Mock DisplayImeController mDisplayImeController; @Mock DisplayInsetsController mDisplayInsetsController; @@ -137,7 +138,8 @@ public class SplitScreenControllerTests extends ShellTestCase { mDisplayInsetsController, mDragAndDropController, mTransitions, mTransactionPool, mIconProvider, Optional.of(mRecentTasks), mLaunchAdjacentController, Optional.of(mWindowDecorViewModel), Optional.of(mDesktopTasksController), - mStageCoordinator, mMultiInstanceHelper, mSplitState, mMainExecutor, mMainHandler)); + mStageCoordinator, mMultiInstanceHelper, mSplitState, mMainExecutor, mMainHandler, + mBgExecutor)); } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java index 1a2d60ddad3e..232ae0750c3a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java @@ -78,14 +78,14 @@ public class SplitTestUtils { StageTaskListener sideStage, DisplayController displayController, DisplayImeController imeController, DisplayInsetsController insetsController, SplitLayout splitLayout, Transitions transitions, TransactionPool transactionPool, - ShellExecutor mainExecutor, Handler mainHandler, + ShellExecutor mainExecutor, Handler mainHandler, ShellExecutor bgExecutor, Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState) { super(context, displayId, syncQueue, taskOrganizer, mainStage, sideStage, displayController, imeController, insetsController, splitLayout, - transitions, transactionPool, mainExecutor, mainHandler, recentTasks, - launchAdjacentController, windowDecorViewModel, splitState); + transitions, transactionPool, mainExecutor, mainHandler, bgExecutor, + recentTasks, launchAdjacentController, windowDecorViewModel, splitState); // Prepare root task for testing. mRootTask = new TestRunningTaskInfoBuilder().build(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index de77837cb0e5..0d612c17c462 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -111,6 +111,7 @@ public class SplitTransitionTests extends ShellTestCase { @Mock private WindowDecorViewModel mWindowDecorViewModel; @Mock private SplitState mSplitState; @Mock private ShellExecutor mMainExecutor; + @Mock private ShellExecutor mBgExecutor; @Mock private Handler mMainHandler; @Mock private LaunchAdjacentController mLaunchAdjacentController; @Mock private DefaultMixedHandler mMixedHandler; @@ -136,16 +137,18 @@ public class SplitTransitionTests extends ShellTestCase { mSplitLayout = SplitTestUtils.createMockSplitLayout(); mMainStage = spy(new StageTaskListener(mContext, mTaskOrganizer, DEFAULT_DISPLAY, mock( StageTaskListener.StageListenerCallbacks.class), mSyncQueue, - mIconProvider, Optional.of(mWindowDecorViewModel), STAGE_TYPE_MAIN)); + mIconProvider, mMainExecutor, mBgExecutor, Optional.of(mWindowDecorViewModel), + STAGE_TYPE_MAIN)); mMainStage.onTaskAppeared(new TestRunningTaskInfoBuilder().build(), createMockSurface()); mSideStage = spy(new StageTaskListener(mContext, mTaskOrganizer, DEFAULT_DISPLAY, mock( StageTaskListener.StageListenerCallbacks.class), mSyncQueue, - mIconProvider, Optional.of(mWindowDecorViewModel), STAGE_TYPE_SIDE)); + mIconProvider, mMainExecutor, mBgExecutor, Optional.of(mWindowDecorViewModel), + STAGE_TYPE_SIDE)); mSideStage.onTaskAppeared(new TestRunningTaskInfoBuilder().build(), createMockSurface()); mStageCoordinator = new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mTaskOrganizer, mMainStage, mSideStage, mDisplayController, mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions, - mTransactionPool, mMainExecutor, mMainHandler, Optional.empty(), + mTransactionPool, mMainExecutor, mMainHandler, mBgExecutor, Optional.empty(), mLaunchAdjacentController, Optional.empty(), mSplitState); mStageCoordinator.setMixedHandler(mMixedHandler); mSplitScreenTransitions = mStageCoordinator.getSplitTransitions(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index 7afcce1243e3..a6aeabd5bd19 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -119,6 +119,8 @@ public class StageCoordinatorTests extends ShellTestCase { private DefaultMixedHandler mDefaultMixedHandler; @Mock private SplitState mSplitState; + @Mock + private ShellExecutor mBgExecutor; private final Rect mBounds1 = new Rect(10, 20, 30, 40); private final Rect mBounds2 = new Rect(5, 10, 15, 20); @@ -141,8 +143,8 @@ public class StageCoordinatorTests extends ShellTestCase { mStageCoordinator = spy(new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mTaskOrganizer, mMainStage, mSideStage, mDisplayController, mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions, mTransactionPool, - mMainExecutor, mMainHandler, Optional.empty(), mLaunchAdjacentController, - Optional.empty(), mSplitState)); + mMainExecutor, mMainHandler, mBgExecutor, Optional.empty(), + mLaunchAdjacentController, Optional.empty(), mSplitState)); mDividerLeash = new SurfaceControl.Builder().setName("fakeDivider").build(); when(mSplitLayout.getTopLeftBounds()).thenReturn(mBounds1); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageOrderOperatorTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageOrderOperatorTests.kt new file mode 100644 index 000000000000..62b830dfd691 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageOrderOperatorTests.kt @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.splitscreen + +import android.view.Display.DEFAULT_DISPLAY +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.launcher3.icons.IconProvider +import com.android.wm.shell.Flags.enableFlexibleSplit +import com.android.wm.shell.ShellTaskOrganizer +import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.common.ShellExecutor +import com.android.wm.shell.common.SyncTransactionQueue +import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_33_66 +import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50 +import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_66_33 +import com.android.wm.shell.splitscreen.StageTaskListener.StageListenerCallbacks +import com.android.wm.shell.windowdecor.WindowDecorViewModel +import org.junit.Assume.assumeTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import java.util.Optional + +@SmallTest +@RunWith(AndroidJUnit4::class) +class StageOrderOperatorTests : ShellTestCase() { + + @Mock + lateinit var mMainExecutor: ShellExecutor + @Mock + lateinit var mBgExecutor: ShellExecutor + @Mock + lateinit var mTaskOrganizer: ShellTaskOrganizer + @Mock + lateinit var mSyncQueue: SyncTransactionQueue + @Mock + lateinit var stageListenerCallbacks: StageListenerCallbacks + @Mock + lateinit var iconProvider: IconProvider + @Mock + lateinit var windowDecorViewModel: Optional<WindowDecorViewModel> + + lateinit var stageOrderOperator: StageOrderOperator + + @Before + fun setup() { + stageOrderOperator = StageOrderOperator( + context, + mTaskOrganizer, + DEFAULT_DISPLAY, + stageListenerCallbacks, + mSyncQueue, + iconProvider, + mMainExecutor, + mBgExecutor, + windowDecorViewModel, + ) + assert(stageOrderOperator.activeStages.size == 0) + } + + @Test + fun activeStages_2_2app_50_50_split() { + assumeTrue(enableFlexibleSplit()) + + stageOrderOperator.onEnteringSplit(SNAP_TO_2_50_50) + assert(stageOrderOperator.activeStages.size == 2) + } + + @Test + fun activeStages_2_2app_33_66_split() { + assumeTrue(enableFlexibleSplit()) + + stageOrderOperator.onEnteringSplit(SNAP_TO_2_33_66) + assert(stageOrderOperator.activeStages.size == 2) + } + + @Test + fun activeStages_2_2app_66_33_split() { + assumeTrue(enableFlexibleSplit()) + + stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33) + assert(stageOrderOperator.activeStages.size == 2) + } + + @Test + fun activateSameCountStage_noOp() { + assumeTrue(enableFlexibleSplit()) + + stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33) + stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33) + assert(stageOrderOperator.activeStages.size == 2) + } + + @Test + fun deactivate_emptyActiveStages() { + assumeTrue(enableFlexibleSplit()) + + stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33) + stageOrderOperator.onExitingSplit() + assert(stageOrderOperator.activeStages.isEmpty()) + } + + @Test + fun swapDividerPos_twoApps() { + assumeTrue(enableFlexibleSplit()) + + stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33) + val stageIndex0: StageTaskListener = stageOrderOperator.activeStages[0] + val stageIndex1: StageTaskListener = stageOrderOperator.activeStages[1] + + stageOrderOperator.onDoubleTappedDivider() + val newStageIndex0: StageTaskListener = stageOrderOperator.activeStages[0] + val newStageIndex1: StageTaskListener = stageOrderOperator.activeStages[1] + + assert(stageIndex0 == newStageIndex1) + assert(stageIndex1 == newStageIndex0) + } + + @Test + fun swapDividerPos_twiceNoOp_twoApps() { + assumeTrue(enableFlexibleSplit()) + + stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33) + val stageIndex0: StageTaskListener = stageOrderOperator.activeStages[0] + val stageIndex1: StageTaskListener = stageOrderOperator.activeStages[1] + + stageOrderOperator.onDoubleTappedDivider() + stageOrderOperator.onDoubleTappedDivider() + val newStageIndex0: StageTaskListener = stageOrderOperator.activeStages[0] + val newStageIndex1: StageTaskListener = stageOrderOperator.activeStages[1] + + assert(stageIndex0 == newStageIndex0) + assert(stageIndex1 == newStageIndex1) + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java index fe91440b106f..effc6a7daf62 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java @@ -43,6 +43,7 @@ import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestRunningTaskInfoBuilder; +import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.windowdecor.WindowDecorViewModel; @@ -73,6 +74,10 @@ public final class StageTaskListenerTests extends ShellTestCase { @Mock private SyncTransactionQueue mSyncQueue; @Mock + private ShellExecutor mMainExecutor; + @Mock + private ShellExecutor mBgExecutor; + @Mock private IconProvider mIconProvider; @Mock private WindowDecorViewModel mWindowDecorViewModel; @@ -95,6 +100,8 @@ public final class StageTaskListenerTests extends ShellTestCase { mCallbacks, mSyncQueue, mIconProvider, + mMainExecutor, + mBgExecutor, Optional.of(mWindowDecorViewModel), STAGE_TYPE_UNDEFINED); mRootTask = new TestRunningTaskInfoBuilder().build(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt index e871711fd25e..cf6c3a5e03a0 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt @@ -63,6 +63,7 @@ class DesktopHeaderManageWindowsMenuTest : ShellTestCase() { userRepositories = DesktopUserRepositories( context = context, shellInit = ShellInit(TestShellExecutor()), + shellController = mock(), persistentRepository = mock(), repositoryInitializer = mock(), mainCoroutineScope = mock(), diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index 88f62d10913d..0214da4660ad 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -388,7 +388,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest } @Test - fun testOnDecorMaximizedOrRestored_togglesTaskSize() { + fun testOnDecorMaximizedOrRestored_togglesTaskSize_maximize() { val maxOrRestoreListenerCaptor = forClass(Function0::class.java) as ArgumentCaptor<Function0<Unit>> val decor = createOpenTaskDecoration( @@ -409,6 +409,52 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest } @Test + fun testOnDecorMaximizedOrRestored_togglesTaskSize_maximizeFromMaximizedSize() { + val maxOrRestoreListenerCaptor = forClass(Function0::class.java) + as ArgumentCaptor<Function0<Unit>> + val decor = createOpenTaskDecoration( + windowingMode = WINDOWING_MODE_FREEFORM, + onMaxOrRestoreListenerCaptor = maxOrRestoreListenerCaptor + ) + val movedMaximizedBounds = Rect(STABLE_BOUNDS) + movedMaximizedBounds.offset(10, 10) + decor.mTaskInfo.configuration.windowConfiguration.bounds.set(movedMaximizedBounds) + + maxOrRestoreListenerCaptor.value.invoke() + + verify(mockDesktopTasksController).toggleDesktopTaskSize( + decor.mTaskInfo, + ToggleTaskSizeInteraction( + ToggleTaskSizeInteraction.Direction.MAXIMIZE, + ToggleTaskSizeInteraction.Source.MAXIMIZE_MENU_TO_MAXIMIZE, + InputMethod.UNKNOWN_INPUT_METHOD + ) + ) + } + + @Test + fun testOnDecorMaximizedOrRestored_togglesTaskSize_restore() { + val maxOrRestoreListenerCaptor = forClass(Function0::class.java) + as ArgumentCaptor<Function0<Unit>> + val decor = createOpenTaskDecoration( + windowingMode = WINDOWING_MODE_FREEFORM, + onMaxOrRestoreListenerCaptor = maxOrRestoreListenerCaptor + ) + decor.mTaskInfo.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS) + + maxOrRestoreListenerCaptor.value.invoke() + + verify(mockDesktopTasksController).toggleDesktopTaskSize( + decor.mTaskInfo, + ToggleTaskSizeInteraction( + ToggleTaskSizeInteraction.Direction.RESTORE, + ToggleTaskSizeInteraction.Source.MAXIMIZE_MENU_TO_RESTORE, + InputMethod.UNKNOWN_INPUT_METHOD + ) + ) + } + + @Test fun testOnDecorMaximizedOrRestored_closesMenus() { val maxOrRestoreListenerCaptor = forClass(Function0::class.java) as ArgumentCaptor<Function0<Unit>> @@ -591,7 +637,8 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest verify(mockDesktopTasksController).moveTaskToDesktop( eq(decor.mTaskInfo.taskId), any(), - eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) + eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON), + anyOrNull() ) } @@ -824,7 +871,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest ) verify(mockDesktopTasksController, times(1)) - .moveTaskToDesktop(any(), any(), any()) + .moveTaskToDesktop(any(), any(), any(), anyOrNull()) } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt index 6be234ef5ca6..b5e8cebc1277 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt @@ -74,6 +74,7 @@ import com.android.wm.shell.transition.Transitions import com.android.wm.shell.util.StubTransaction import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel.DesktopModeKeyguardChangeListener import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel.DesktopModeOnInsetsChangedListener +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder @@ -91,6 +92,8 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import java.util.Optional import java.util.function.Supplier +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainCoroutineDispatcher /** * Utility class for tests of [DesktopModeWindowDecorViewModel] @@ -149,7 +152,6 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() { protected val mockCaptionHandleRepository = mock<WindowDecorCaptionHandleRepository>() protected val mockDesktopRepository: DesktopRepository = mock<DesktopRepository>() protected val motionEvent = mock<MotionEvent>() - val displayController = mock<DisplayController>() val displayLayout = mock<DisplayLayout>() protected lateinit var spyContext: TestableContext private lateinit var desktopModeEventLogger: DesktopModeEventLogger @@ -182,6 +184,8 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() { testShellExecutor, mockMainHandler, mockMainChoreographer, + mock<MainCoroutineDispatcher>(), + mock<CoroutineScope>(), bgExecutor, shellInit, mockShellCommandHandler, @@ -214,7 +218,8 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() { mockTaskPositionerFactory, mockFocusTransitionObserver, desktopModeEventLogger, - mock<DesktopModeUiEventLogger>() + mock<DesktopModeUiEventLogger>(), + mock<WindowDecorTaskResourceLoader>() ) desktopModeWindowDecorViewModel.setSplitScreenController(mockSplitScreenController) whenever(mockDisplayController.getDisplayLayout(any())).thenReturn(mockDisplayLayout) @@ -255,7 +260,7 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() { argumentCaptor<DesktopModeKeyguardChangeListener>() verify(mockShellController).addKeyguardChangeListener(keyguardChangedCaptor.capture()) desktopModeOnKeyguardChangedListener = keyguardChangedCaptor.firstValue - whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout) + whenever(mockDisplayController.getDisplayLayout(anyInt())).thenReturn(displayLayout) whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(STABLE_BOUNDS) } @@ -294,8 +299,9 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() { val decoration = Mockito.mock(DesktopModeWindowDecoration::class.java) whenever( mockDesktopModeWindowDecorFactory.create( - any(), any(), any(), any(), any(), any(), eq(task), any(), any(), any(), any(), - any(), any(), any(), any(), any(), any(), any(), any(), any()) + any(), any(), any(), any(), any(), any(), any(), eq(task), any(), any(), any(), + any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), + any(), any()) ).thenReturn(decoration) decoration.mTaskInfo = task whenever(decoration.user).thenReturn(mockUserHandle) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java index 5d5d1f220ae0..8a1a9b5ef80b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; +import static android.app.assist.AssistContent.EXTRA_SESSION_TRANSFER_WEB_URI; import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; @@ -113,6 +114,7 @@ import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.windowdecor.WindowDecoration.RelayoutParams; +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader; import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost; import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier; import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder; @@ -121,6 +123,9 @@ import kotlin.Unit; import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function1; +import kotlinx.coroutines.CoroutineScope; +import kotlinx.coroutines.MainCoroutineDispatcher; + import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; @@ -157,6 +162,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { private static final Uri TEST_URI1 = Uri.parse("https://www.google.com/"); private static final Uri TEST_URI2 = Uri.parse("https://docs.google.com/"); private static final Uri TEST_URI3 = Uri.parse("https://slides.google.com/"); + private static final Uri TEST_URI4 = Uri.parse("https://calendar.google.com/"); @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT); @@ -171,6 +177,10 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { @Mock private Choreographer mMockChoreographer; @Mock + private MainCoroutineDispatcher mMockMainCoroutineDispatcher; + @Mock + private CoroutineScope mMockBgCoroutineScope; + @Mock private SyncTransactionQueue mMockSyncQueue; @Mock private AppHeaderViewHolder.Factory mMockAppHeaderViewHolderFactory; @@ -222,6 +232,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { private DesktopModeEventLogger mDesktopModeEventLogger; @Mock private DesktopRepository mDesktopRepository; + @Mock + private WindowDecorTaskResourceLoader mMockTaskResourceLoader; @Captor private ArgumentCaptor<Function1<Boolean, Unit>> mOnMaxMenuHoverChangeListener; @Captor @@ -232,6 +244,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { private StaticMockitoSession mMockitoSession; private TestableContext mTestableContext; private final ShellExecutor mBgExecutor = new TestShellExecutor(); + private final ShellExecutor mMainExecutor = new TestShellExecutor(); private final AssistContent mAssistContent = new AssistContent(); private final Region mExclusionRegion = Region.obtain(); @@ -271,13 +284,13 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final Display defaultDisplay = mock(Display.class); doReturn(defaultDisplay).when(mMockDisplayController).getDisplay(Display.DEFAULT_DISPLAY); doReturn(mInsetsState).when(mMockDisplayController).getInsetsState(anyInt()); - when(mMockHandleMenuFactory.create(any(), any(), anyInt(), any(), any(), any(), + when(mMockHandleMenuFactory.create(any(), any(), any(), any(), any(), anyInt(), any(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), any(), anyInt(), anyInt(), anyInt(), anyInt())) .thenReturn(mMockHandleMenu); when(mMockMultiInstanceHelper.supportsMultiInstanceSplit(any())).thenReturn(false); - when(mMockAppHeaderViewHolderFactory.create(any(), any(), any(), any(), any(), any(), any(), - any())).thenReturn(mMockAppHeaderViewHolder); + when(mMockAppHeaderViewHolderFactory.create(any(), any(), any(), any(), any(), any())) + .thenReturn(mMockAppHeaderViewHolder); when(mMockDesktopUserRepositories.getCurrent()).thenReturn(mDesktopRepository); when(mMockDesktopUserRepositories.getProfile(anyInt())).thenReturn(mDesktopRepository); when(mMockWindowDecorViewHostSupplier.acquire(any(), eq(defaultDisplay))) @@ -1322,11 +1335,11 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB) - public void capturedLink_handleMenuBrowserLinkSetToCapturedLinkIfValid() { + public void capturedLink_CapturedLinkUsedIfValidAndWebUriUnavailable() { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); final DesktopModeWindowDecoration decor = createWindowDecoration( - taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */, - TEST_URI3 /* generic link */); + taskInfo, TEST_URI1 /* captured link */, null /* web uri */, + null /* session transfer uri */, TEST_URI4 /* generic link */); // Verify handle menu's browser link set as captured link createHandleMenu(decor); @@ -1339,7 +1352,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); final DesktopModeWindowDecoration decor = createWindowDecoration( taskInfo, TEST_URI1 /* captured link */, null /* web uri */, - null /* generic link */); + null /* session transfer uri */, null /* generic link */); final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor = ArgumentCaptor.forClass(Function1.class); @@ -1373,7 +1386,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); final DesktopModeWindowDecoration decor = createWindowDecoration( taskInfo, TEST_URI1 /* captured link */, null /* web uri */, - null /* generic link */); + null /* session transfer uri */, null /* generic link */); final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor = ArgumentCaptor.forClass(Function1.class); @@ -1406,7 +1419,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); final DesktopModeWindowDecoration decor = createWindowDecoration( taskInfo, TEST_URI1 /* captured link */, null /* web uri */, - null /* generic link */); + null /* session transfer uri */, null /* generic link */); final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor = ArgumentCaptor.forClass(Function1.class); createHandleMenu(decor); @@ -1432,11 +1445,23 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB) - public void webUriLink_webUriLinkUsedWhenCapturedLinkUnavailable() { + public void webUriLink_webUriLinkUsedWhenWhenAvailable() { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); final DesktopModeWindowDecoration decor = createWindowDecoration( - taskInfo, null /* captured link */, TEST_URI2 /* web uri */, - TEST_URI3 /* generic link */); + taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */, + TEST_URI3 /* session transfer uri */, TEST_URI4 /* generic link */); + // Verify handle menu's browser link set as web uri link when captured link is unavailable + createHandleMenu(decor); + verifyHandleMenuCreated(TEST_URI3); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB) + public void webUriLink_webUriLinkUsedWhenSessionTransferUriUnavailable() { + final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); + final DesktopModeWindowDecoration decor = createWindowDecoration( + taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */, + null /* session transfer uri */, TEST_URI4 /* generic link */); // Verify handle menu's browser link set as web uri link when captured link is unavailable createHandleMenu(decor); verifyHandleMenuCreated(TEST_URI2); @@ -1448,12 +1473,12 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); final DesktopModeWindowDecoration decor = createWindowDecoration( taskInfo, null /* captured link */, null /* web uri */, - TEST_URI3 /* generic link */); + null /* session transfer uri */, TEST_URI4 /* generic link */); // Verify handle menu's browser link set as generic link when captured link and web uri link // are unavailable createHandleMenu(decor); - verifyHandleMenuCreated(TEST_URI3); + verifyHandleMenuCreated(TEST_URI4); } @Test @@ -1637,7 +1662,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB) - public void browserApp_webUriUsedForBrowserApp() { + public void browserApp_transferSessionUriUsedForBrowserAppWhenAvailable() { // Make {@link AppToWebUtils#isBrowserApp} return true ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.handleAllWebDataURI = true; @@ -1648,7 +1673,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); final DesktopModeWindowDecoration decor = createWindowDecoration( taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */, - TEST_URI3 /* generic link */); + null /* transfer session uri */, TEST_URI4 /* generic link */); // Verify web uri used for browser applications createHandleMenu(decor); @@ -1656,8 +1681,29 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { } + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB) + public void browserApp_webUriUsedForBrowserAppWhenTransferSessionUriUnavailable() { + // Make {@link AppToWebUtils#isBrowserApp} return true + ResolveInfo resolveInfo = new ResolveInfo(); + resolveInfo.handleAllWebDataURI = true; + resolveInfo.activityInfo = createActivityInfo(); + when(mMockPackageManager.queryIntentActivitiesAsUser(any(), anyInt(), anyInt())) + .thenReturn(List.of(resolveInfo)); + + final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */); + final DesktopModeWindowDecoration decor = createWindowDecoration( + taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */, + TEST_URI3 /* transfer session uri */, TEST_URI4 /* generic link */); + + // Verify web uri used for browser applications + createHandleMenu(decor); + verifyHandleMenuCreated(TEST_URI3); + } + + private void verifyHandleMenuCreated(@Nullable Uri uri) { - verify(mMockHandleMenuFactory).create(any(), any(), anyInt(), any(), any(), + verify(mMockHandleMenuFactory).create(any(), any(), any(), any(), any(), anyInt(), any(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), argThat(intent -> (uri == null && intent == null) || intent.getData().equals(uri)), @@ -1692,10 +1738,11 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { private DesktopModeWindowDecoration createWindowDecoration( ActivityManager.RunningTaskInfo taskInfo, @Nullable Uri capturedLink, - @Nullable Uri webUri, @Nullable Uri genericLink) { + @Nullable Uri webUri, @Nullable Uri sessionTransferUri, @Nullable Uri genericLink) { taskInfo.capturedLink = capturedLink; taskInfo.capturedLinkTimestamp = System.currentTimeMillis(); mAssistContent.setWebUri(webUri); + mAssistContent.getExtras().putObject(EXTRA_SESSION_TRANSFER_WEB_URI, sessionTransferUri); final String genericLinkString = genericLink == null ? null : genericLink.toString(); doReturn(genericLinkString).when(mMockGenericLinksParser).getGenericLink(any()); // Relayout to set captured link @@ -1724,12 +1771,14 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { MaximizeMenuFactory maximizeMenuFactory, boolean relayout) { final DesktopModeWindowDecoration windowDecor = new DesktopModeWindowDecoration(mContext, - mContext, mMockDisplayController, mMockSplitScreenController, - mMockDesktopUserRepositories, mMockShellTaskOrganizer, taskInfo, - mMockSurfaceControl, mMockHandler, mBgExecutor, mMockChoreographer, mMockSyncQueue, - mMockAppHeaderViewHolderFactory, mMockRootTaskDisplayAreaOrganizer, - mMockGenericLinksParser, mMockAssistContentRequester, SurfaceControl.Builder::new, - mMockTransactionSupplier, WindowContainerTransaction::new, SurfaceControl::new, + mContext, mMockDisplayController, mMockTaskResourceLoader, + mMockSplitScreenController, mMockDesktopUserRepositories, mMockShellTaskOrganizer, + taskInfo, mMockSurfaceControl, mMockHandler, mMainExecutor, + mMockMainCoroutineDispatcher, mMockBgCoroutineScope, mBgExecutor, + mMockChoreographer, mMockSyncQueue, mMockAppHeaderViewHolderFactory, + mMockRootTaskDisplayAreaOrganizer, mMockGenericLinksParser, + mMockAssistContentRequester, SurfaceControl.Builder::new, mMockTransactionSupplier, + WindowContainerTransaction::new, SurfaceControl::new, new WindowManagerWrapper(mMockWindowManager), mMockSurfaceControlViewHostFactory, mMockWindowDecorViewHostSupplier, maximizeMenuFactory, mMockHandleMenuFactory, mMockMultiInstanceHelper, mMockCaptionHandleRepository, mDesktopModeEventLogger); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt index 3bcbcbdd9105..cbfb57edc72d 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt @@ -24,6 +24,7 @@ import android.graphics.Bitmap import android.graphics.Color import android.graphics.Point import android.graphics.Rect +import android.graphics.drawable.BitmapDrawable import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import android.testing.AndroidTestingRunner @@ -49,6 +50,13 @@ import com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_UND import com.android.wm.shell.splitscreen.SplitScreenController import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Before @@ -68,6 +76,7 @@ import org.mockito.kotlin.whenever * Build/Install/Run: * atest WMShellUnitTests:HandleMenuTest */ +@OptIn(ExperimentalCoroutinesApi::class) @SmallTest @TestableLooper.RunWithLooper @RunWith(AndroidTestingRunner::class) @@ -81,14 +90,6 @@ class HandleMenuTest : ShellTestCase() { @Mock private lateinit var mockWindowManager: WindowManager @Mock - private lateinit var onClickListener: View.OnClickListener - @Mock - private lateinit var onTouchListener: View.OnTouchListener - @Mock - private lateinit var appIcon: Bitmap - @Mock - private lateinit var appName: CharSequence - @Mock private lateinit var displayController: DisplayController @Mock private lateinit var splitScreenController: SplitScreenController @@ -96,6 +97,10 @@ class HandleMenuTest : ShellTestCase() { private lateinit var displayLayout: DisplayLayout @Mock private lateinit var mockSurfaceControlViewHost: SurfaceControlViewHost + @Mock + private lateinit var mockTaskResourceLoader: WindowDecorTaskResourceLoader + @Mock + private lateinit var mockAppIcon: Bitmap private lateinit var handleMenu: HandleMenu @@ -136,7 +141,7 @@ class HandleMenuTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_HANDLE_INPUT_FIX) - fun testFullscreenMenuUsesSystemViewContainer() { + fun testFullscreenMenuUsesSystemViewContainer() = runTest { createTaskInfo(WINDOWING_MODE_FULLSCREEN, SPLIT_POSITION_UNDEFINED) val handleMenu = createAndShowHandleMenu(SPLIT_POSITION_UNDEFINED) assertTrue(handleMenu.handleMenuViewContainer is AdditionalSystemViewContainer) @@ -148,7 +153,7 @@ class HandleMenuTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_HANDLE_INPUT_FIX) - fun testFreeformMenu_usesViewHostViewContainer() { + fun testFreeformMenu_usesViewHostViewContainer() = runTest { createTaskInfo(WINDOWING_MODE_FREEFORM, SPLIT_POSITION_UNDEFINED) handleMenu = createAndShowHandleMenu(SPLIT_POSITION_UNDEFINED) assertTrue(handleMenu.handleMenuViewContainer is AdditionalViewHostViewContainer) @@ -159,7 +164,7 @@ class HandleMenuTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_HANDLE_INPUT_FIX) - fun testSplitLeftMenu_usesSystemViewContainer() { + fun testSplitLeftMenu_usesSystemViewContainer() = runTest { createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, SPLIT_POSITION_TOP_OR_LEFT) handleMenu = createAndShowHandleMenu(SPLIT_POSITION_TOP_OR_LEFT) assertTrue(handleMenu.handleMenuViewContainer is AdditionalSystemViewContainer) @@ -174,7 +179,7 @@ class HandleMenuTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_HANDLE_INPUT_FIX) - fun testSplitRightMenu_usesSystemViewContainer() { + fun testSplitRightMenu_usesSystemViewContainer() = runTest { createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, SPLIT_POSITION_BOTTOM_OR_RIGHT) handleMenu = createAndShowHandleMenu(SPLIT_POSITION_BOTTOM_OR_RIGHT) assertTrue(handleMenu.handleMenuViewContainer is AdditionalSystemViewContainer) @@ -188,7 +193,7 @@ class HandleMenuTest : ShellTestCase() { } @Test - fun testCreate_forceShowSystemBars_usesSystemViewContainer() { + fun testCreate_forceShowSystemBars_usesSystemViewContainer() = runTest { createTaskInfo(WINDOWING_MODE_FREEFORM) handleMenu = createAndShowHandleMenu(forceShowSystemBars = true) @@ -198,7 +203,7 @@ class HandleMenuTest : ShellTestCase() { } @Test - fun testCreate_forceShowSystemBars() { + fun testCreate_forceShowSystemBars() = runTest { createTaskInfo(WINDOWING_MODE_FREEFORM) handleMenu = createAndShowHandleMenu(forceShowSystemBars = true) @@ -208,6 +213,18 @@ class HandleMenuTest : ShellTestCase() { assertTrue((types and systemBars()) != 0) } + @Test + fun testCreate_loadsAppInfoInBackground() = runTest { + createTaskInfo(WINDOWING_MODE_FREEFORM) + + handleMenu = createAndShowHandleMenu() + advanceUntilIdle() + + assertThat(handleMenu.handleMenuView!!.appNameView.text).isEqualTo(APP_NAME) + val drawable = handleMenu.handleMenuView!!.appIconView.drawable as BitmapDrawable + assertThat(drawable.bitmap).isEqualTo(mockAppIcon) + } + private fun createTaskInfo(windowingMode: Int, splitPosition: Int? = null) { val taskDescriptionBuilder = ActivityManager.TaskDescription.Builder() .setBackgroundColor(Color.YELLOW) @@ -238,9 +255,13 @@ class HandleMenuTest : ShellTestCase() { (it.arguments[1] as Rect).set(SPLIT_RIGHT_BOUNDS) } } + whenever(mockTaskResourceLoader.getName(mockDesktopWindowDecoration.mTaskInfo)) + .thenReturn(APP_NAME) + whenever(mockTaskResourceLoader.getHeaderIcon(mockDesktopWindowDecoration.mTaskInfo)) + .thenReturn(mockAppIcon) } - private fun createAndShowHandleMenu( + private fun TestScope.createAndShowHandleMenu( splitPosition: Int? = null, forceShowSystemBars: Boolean = false ): HandleMenu { @@ -262,12 +283,22 @@ class HandleMenuTest : ShellTestCase() { } else -> error("Invalid windowing mode") } - val handleMenu = HandleMenu(mockDesktopWindowDecoration, + val handleMenu = HandleMenu( + StandardTestDispatcher(testScheduler), + this, + mockDesktopWindowDecoration, WindowManagerWrapper(mockWindowManager), - layoutId, appIcon, appName, splitScreenController, shouldShowWindowingPill = true, - shouldShowNewWindowButton = true, shouldShowManageWindowsButton = false, - shouldShowChangeAspectRatioButton = false, shouldShowDesktopModeButton = true, - isBrowserApp = false, null /* openInAppOrBrowserIntent */, captionWidth = HANDLE_WIDTH, + mockTaskResourceLoader, + layoutId, + splitScreenController, + shouldShowWindowingPill = true, + shouldShowNewWindowButton = true, + shouldShowManageWindowsButton = false, + shouldShowChangeAspectRatioButton = false, + shouldShowDesktopModeButton = true, + isBrowserApp = false, + null /* openInAppOrBrowserIntent */, + captionWidth = HANDLE_WIDTH, captionHeight = 50, captionX = captionX, captionY = 0, @@ -300,5 +331,6 @@ class HandleMenuTest : ShellTestCase() { private const val MENU_PILL_ELEVATION = 2 private const val MENU_PILL_SPACING_MARGIN = 4 private const val HANDLE_WIDTH = 80 + private const val APP_NAME = "Test App" } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/ResizeVeilTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/ResizeVeilTest.kt index e0d16aab1e07..fa3d3e4016e9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/ResizeVeilTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/ResizeVeilTest.kt @@ -17,6 +17,7 @@ package com.android.wm.shell.windowdecor import android.graphics.Bitmap import android.graphics.Rect +import android.graphics.drawable.BitmapDrawable import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.view.Display @@ -29,6 +30,13 @@ import com.android.wm.shell.TestRunningTaskInfoBuilder import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayController.OnDisplaysChangedListener import com.android.wm.shell.windowdecor.WindowDecoration.SurfaceControlViewHostFactory +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -54,6 +62,7 @@ import org.mockito.kotlin.whenever * Build/Install/Run: * atest WMShellUnitTests:ResizeVeilTest */ +@OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWith(AndroidTestingRunner::class) @TestableLooper.RunWithLooper @@ -85,6 +94,8 @@ class ResizeVeilTest : ShellTestCase() { private lateinit var mockIconSurface: SurfaceControl @Mock private lateinit var mockTransaction: SurfaceControl.Transaction + @Mock + private lateinit var mockTaskResourceLoader: WindowDecorTaskResourceLoader private val taskInfo = TestRunningTaskInfoBuilder().build() @@ -115,7 +126,7 @@ class ResizeVeilTest : ShellTestCase() { } @Test - fun init_displayAvailable_viewHostCreated() { + fun init_displayAvailable_viewHostCreated() = runTest { createResizeVeil(withDisplayAvailable = true) verify(mockSurfaceControlViewHostFactory) @@ -123,7 +134,7 @@ class ResizeVeilTest : ShellTestCase() { } @Test - fun init_displayUnavailable_viewHostNotCreatedUntilDisplayAppears() { + fun init_displayUnavailable_viewHostNotCreatedUntilDisplayAppears() = runTest { createResizeVeil(withDisplayAvailable = false) verify(mockSurfaceControlViewHostFactory, never()) @@ -140,14 +151,14 @@ class ResizeVeilTest : ShellTestCase() { } @Test - fun dispose_removesDisplayWindowListener() { + fun dispose_removesDisplayWindowListener() = runTest { createResizeVeil().dispose() verify(mockDisplayController).removeDisplayWindowListener(any()) } @Test - fun showVeil() { + fun showVeil() = runTest { val veil = createResizeVeil() veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */) @@ -159,7 +170,7 @@ class ResizeVeilTest : ShellTestCase() { } @Test - fun showVeil_displayUnavailable_doesNotShow() { + fun showVeil_displayUnavailable_doesNotShow() = runTest { val veil = createResizeVeil(withDisplayAvailable = false) veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */) @@ -171,7 +182,7 @@ class ResizeVeilTest : ShellTestCase() { } @Test - fun showVeil_alreadyVisible_doesNotShowAgain() { + fun showVeil_alreadyVisible_doesNotShowAgain() = runTest { val veil = createResizeVeil() veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */) @@ -184,7 +195,7 @@ class ResizeVeilTest : ShellTestCase() { } @Test - fun showVeil_reparentsVeilToNewParent() { + fun showVeil_reparentsVeilToNewParent() = runTest { val veil = createResizeVeil(parent = mock()) val newParent = mock<SurfaceControl>() @@ -200,7 +211,7 @@ class ResizeVeilTest : ShellTestCase() { } @Test - fun hideVeil_alreadyHidden_doesNothing() { + fun hideVeil_alreadyHidden_doesNothing() = runTest { val veil = createResizeVeil() veil.hideVeil() @@ -208,16 +219,41 @@ class ResizeVeilTest : ShellTestCase() { verifyZeroInteractions(mockTransaction) } - private fun createResizeVeil( + @Test + fun showVeil_loadsIconInBackground() = runTest { + val veil = createResizeVeil() + veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */) + + advanceUntilIdle() + + verify(mockTaskResourceLoader).getVeilIcon(taskInfo) + assertThat((veil.iconView.drawable as BitmapDrawable).bitmap).isEqualTo(mockAppIcon) + } + + @Test + fun dispose_iconLoading_cancelsJob() = runTest { + val veil = createResizeVeil() + veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */) + + veil.dispose() + advanceUntilIdle() + + assertThat(veil.iconView.drawable).isNull() + } + + private fun TestScope.createResizeVeil( withDisplayAvailable: Boolean = true, parent: SurfaceControl = mock() ): ResizeVeil { whenever(mockDisplayController.getDisplay(taskInfo.displayId)) .thenReturn(if (withDisplayAvailable) mockDisplay else null) + whenever(mockTaskResourceLoader.getVeilIcon(taskInfo)).thenReturn(mockAppIcon) return ResizeVeil( context, mockDisplayController, - mockAppIcon, + mockTaskResourceLoader, + StandardTestDispatcher(testScheduler), + this, parent, { mockTransaction }, mockSurfaceControlBuilderFactory, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoaderTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoaderTest.kt new file mode 100644 index 000000000000..1ec0fe794d0a --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoaderTest.kt @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.wm.shell.windowdecor.common + +import android.app.ActivityManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.pm.ActivityInfo +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import android.os.UserHandle +import android.testing.AndroidTestingRunner +import android.testing.TestableContext +import androidx.test.filters.SmallTest +import com.android.launcher3.icons.BaseIconFactory +import com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT +import com.android.launcher3.icons.IconProvider +import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.TestRunningTaskInfoBuilder +import com.android.wm.shell.TestShellExecutor +import com.android.wm.shell.sysui.ShellController +import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.sysui.UserChangeListener +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader.AppResources +import com.google.common.truth.Truth.assertThat +import org.junit.Assert.assertThrows +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyFloat +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.kotlin.any +import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.spy +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyZeroInteractions +import org.mockito.kotlin.whenever + +/** + * Tests for [WindowDecorTaskResourceLoader]. + * + * Build/Install/Run: atest WindowDecorTaskResourceLoaderTest + */ +@SmallTest +@RunWith(AndroidTestingRunner::class) +class WindowDecorTaskResourceLoaderTest : ShellTestCase() { + private val testExecutor = TestShellExecutor() + private val shellInit = ShellInit(testExecutor) + private val mockShellController = mock<ShellController>() + private val mockPackageManager = mock<PackageManager>() + private val mockIconProvider = mock<IconProvider>() + private val mockHeaderIconFactory = mock<BaseIconFactory>() + private val mockVeilIconFactory = mock<BaseIconFactory>() + + private lateinit var spyContext: TestableContext + private lateinit var loader: WindowDecorTaskResourceLoader + + private val userChangeListenerCaptor = argumentCaptor<UserChangeListener>() + private val userChangeListener: UserChangeListener by lazy { + userChangeListenerCaptor.firstValue + } + + @Before + fun setUp() { + spyContext = spy(mContext) + spyContext.setMockPackageManager(mockPackageManager) + doReturn(spyContext).whenever(spyContext).createContextAsUser(any(), anyInt()) + loader = + WindowDecorTaskResourceLoader( + context = spyContext, + shellInit = shellInit, + shellController = mockShellController, + shellCommandHandler = mock(), + iconProvider = mockIconProvider, + headerIconFactory = mockHeaderIconFactory, + veilIconFactory = mockVeilIconFactory, + ) + shellInit.init() + testExecutor.flushAll() + verify(mockShellController).addUserChangeListener(userChangeListenerCaptor.capture()) + } + + @Test + fun testGetName_notCached_loadsResourceAndCaches() { + val task = createTaskInfo(context.userId) + loader.onWindowDecorCreated(task) + + loader.getName(task) + + verify(mockPackageManager).getApplicationLabel(task.topActivityInfo!!.applicationInfo) + assertThat(loader.taskToResourceCache[task.taskId]?.appName).isNotNull() + } + + @Test + fun testGetName_cached_returnsFromCache() { + val task = createTaskInfo(context.userId) + loader.onWindowDecorCreated(task) + loader.taskToResourceCache[task.taskId] = AppResources("App Name", mock(), mock()) + + loader.getName(task) + + verifyZeroInteractions( + mockPackageManager, + mockIconProvider, + mockHeaderIconFactory, + mockVeilIconFactory, + ) + } + + @Test + fun testGetHeaderIcon_notCached_loadsResourceAndCaches() { + val task = createTaskInfo(context.userId) + loader.onWindowDecorCreated(task) + + loader.getHeaderIcon(task) + + verify(mockHeaderIconFactory).createIconBitmap(any(), anyFloat()) + assertThat(loader.taskToResourceCache[task.taskId]?.appIcon).isNotNull() + } + + @Test + fun testGetHeaderIcon_cached_returnsFromCache() { + val task = createTaskInfo(context.userId) + loader.onWindowDecorCreated(task) + loader.taskToResourceCache[task.taskId] = AppResources("App Name", mock(), mock()) + + loader.getHeaderIcon(task) + + verifyZeroInteractions(mockPackageManager, mockIconProvider, mockHeaderIconFactory) + } + + @Test + fun testGetVeilIcon_notCached_loadsResourceAndCaches() { + val task = createTaskInfo(context.userId) + loader.onWindowDecorCreated(task) + + loader.getVeilIcon(task) + + verify(mockVeilIconFactory).createScaledBitmap(any(), anyInt()) + assertThat(loader.taskToResourceCache[task.taskId]?.veilIcon).isNotNull() + } + + @Test + fun testGetVeilIcon_cached_returnsFromCache() { + val task = createTaskInfo(context.userId) + loader.onWindowDecorCreated(task) + loader.taskToResourceCache[task.taskId] = AppResources("App Name", mock(), mock()) + + loader.getVeilIcon(task) + + verifyZeroInteractions(mockPackageManager, mockIconProvider, mockVeilIconFactory) + } + + @Test + fun testUserChange_updatesContext() { + val newUser = 5000 + val newContext = mock<Context>() + + userChangeListener.onUserChanged(newUser, newContext) + + assertThat(loader.currentUserContext).isEqualTo(newContext) + } + + @Test + fun testUserChange_clearsCache() { + val newUser = 5000 + val newContext = mock<Context>() + val task = createTaskInfo(context.userId) + loader.onWindowDecorCreated(task) + loader.getName(task) + + userChangeListener.onUserChanged(newUser, newContext) + + assertThat(loader.taskToResourceCache[task.taskId]?.appName).isNull() + } + + @Test + fun testGet_nonexistentDecor_throws() { + val task = createTaskInfo(context.userId) + + assertThrows(Exception::class.java) { loader.getName(task) } + } + + private fun createTaskInfo(userId: Int): ActivityManager.RunningTaskInfo { + val appIconDrawable = mock<Drawable>() + val badgedAppIconDrawable = mock<Drawable>() + val activityInfo = ActivityInfo().apply { applicationInfo = ApplicationInfo() } + val componentName = ComponentName("com.foo", "BarActivity") + whenever(mockPackageManager.getActivityInfo(eq(componentName), anyInt())) + .thenReturn(activityInfo) + whenever(mockPackageManager.getApplicationLabel(activityInfo.applicationInfo)) + .thenReturn("Test App") + whenever(mockPackageManager.getUserBadgedIcon(appIconDrawable, UserHandle.of(userId))) + .thenReturn(badgedAppIconDrawable) + whenever(mockIconProvider.getIcon(activityInfo)).thenReturn(appIconDrawable) + whenever(mockHeaderIconFactory.createIconBitmap(badgedAppIconDrawable, 1f)) + .thenReturn(mock()) + whenever(mockVeilIconFactory.createScaledBitmap(appIconDrawable, MODE_DEFAULT)) + .thenReturn(mock()) + return TestRunningTaskInfoBuilder() + .setUserId(userId) + .setBaseIntent(Intent().apply { component = componentName }) + .build() + .apply { topActivityInfo = activityInfo } + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt index 193c2c25d26d..997ece6ecadc 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt @@ -32,7 +32,10 @@ import com.android.wm.shell.desktopmode.ReturnToDragStartAnimator import com.android.wm.shell.desktopmode.ToggleResizeDesktopTaskTransitionHandler import com.android.wm.shell.transition.Transitions import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainCoroutineDispatcher import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -47,6 +50,8 @@ import org.mockito.kotlin.whenever @RunWith(AndroidTestingRunner::class) class DesktopTilingDecorViewModelTest : ShellTestCase() { private val contextMock: Context = mock() + private val mainDispatcher: MainCoroutineDispatcher = mock() + private val bgScope: CoroutineScope = mock() private val displayControllerMock: DisplayController = mock() private val rootTdaOrganizerMock: RootTaskDisplayAreaOrganizer = mock() private val syncQueueMock: SyncTransactionQueue = mock() @@ -61,6 +66,7 @@ class DesktopTilingDecorViewModelTest : ShellTestCase() { private val desktopModeWindowDecorationMock: DesktopModeWindowDecoration = mock() private val desktopTilingDecoration: DesktopTilingWindowDecoration = mock() + private val taskResourceLoader: WindowDecorTaskResourceLoader = mock() private lateinit var desktopTilingDecorViewModel: DesktopTilingDecorViewModel @Before @@ -68,6 +74,8 @@ class DesktopTilingDecorViewModelTest : ShellTestCase() { desktopTilingDecorViewModel = DesktopTilingDecorViewModel( contextMock, + mainDispatcher, + bgScope, displayControllerMock, rootTdaOrganizerMock, syncQueueMock, @@ -77,6 +85,7 @@ class DesktopTilingDecorViewModelTest : ShellTestCase() { returnToDragStartAnimatorMock, userRepositories, desktopModeEventLogger, + taskResourceLoader, ) whenever(contextMock.createContextAsUser(any(), any())).thenReturn(contextMock) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt index 95e2151be96c..2f15c2e38855 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt @@ -45,7 +45,10 @@ import com.android.wm.shell.desktopmode.ToggleResizeDesktopTaskTransitionHandler import com.android.wm.shell.transition.Transitions import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration import com.android.wm.shell.windowdecor.DragResizeWindowGeometry +import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainCoroutineDispatcher import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -99,6 +102,9 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { private val desktopTilingDividerWindowManager: DesktopTilingDividerWindowManager = mock() private val motionEvent: MotionEvent = mock() private val desktopRepository: DesktopRepository = mock() + private val mainDispatcher: MainCoroutineDispatcher = mock() + private val bgScope: CoroutineScope = mock() + private val taskResourceLoader: WindowDecorTaskResourceLoader = mock() private lateinit var tilingDecoration: DesktopTilingWindowDecoration private val split_divider_width = 10 @@ -110,8 +116,11 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { tilingDecoration = DesktopTilingWindowDecoration( context, + mainDispatcher, + bgScope, syncQueue, displayController, + taskResourceLoader, displayId, rootTdaOrganizer, transitions, diff --git a/media/java/android/media/IMediaRoute2ProviderService.aidl b/media/java/android/media/IMediaRoute2ProviderService.aidl index eee3d22c7252..714cacb8d326 100644 --- a/media/java/android/media/IMediaRoute2ProviderService.aidl +++ b/media/java/android/media/IMediaRoute2ProviderService.aidl @@ -33,6 +33,23 @@ oneway interface IMediaRoute2ProviderService { void requestCreateSession(long requestId, String packageName, String routeId, in @nullable Bundle sessionHints); + /** + * Requests the creation of a system media routing session. + * + * @param requestId The id of the request. + * @param uid The uid of the package whose media to route, or + * {@link android.os.Process#INVALID_UID} if routing should not be restricted to a specific + * uid. + * @param packageName The name of the package whose media to route. + * @param routeId The id of the route to be initially selected. + * @param sessionHints An optional bundle with parameters. + */ + void requestCreateSystemMediaSession( + long requestId, + int uid, + String packageName, + String routeId, + in @nullable Bundle sessionHints); void selectRoute(long requestId, String sessionId, String routeId); void deselectRoute(long requestId, String sessionId, String routeId); void transferToRoute(long requestId, String sessionId, String routeId); diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index a3ad340f6ef4..037b97a61b3f 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -917,6 +917,17 @@ public final class MediaRoute2Info implements Parcelable { } /** + * Returns whether this route supports routing of the system media. + * + * @hide + */ + public boolean supportsSystemMediaRouting() { + return (mRoutingTypeFlags + & (FLAG_ROUTING_TYPE_SYSTEM_VIDEO | FLAG_ROUTING_TYPE_SYSTEM_AUDIO)) + != 0; + } + + /** * Returns true if the route info has all of the required field. * A route is valid if and only if it is obtained from * {@link com.android.server.media.MediaRouterService}. diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java index 547099f044b2..09f40e005b4c 100644 --- a/media/java/android/media/MediaRoute2ProviderService.java +++ b/media/java/android/media/MediaRoute2ProviderService.java @@ -18,14 +18,21 @@ package android.media; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; +import static java.util.Objects.requireNonNull; + +import android.Manifest; import android.annotation.CallSuper; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.app.Service; import android.content.Intent; +import android.media.audiopolicy.AudioMix; +import android.media.audiopolicy.AudioMixingRule; +import android.media.audiopolicy.AudioPolicy; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -36,6 +43,7 @@ import android.os.RemoteException; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; +import android.util.LongSparseArray; import com.android.internal.annotations.GuardedBy; import com.android.media.flags.Flags; @@ -47,7 +55,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Deque; import java.util.List; -import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -83,8 +90,7 @@ public abstract class MediaRoute2ProviderService extends Service { public static final String SERVICE_INTERFACE = "android.media.MediaRoute2ProviderService"; /** - * {@link Intent} action that indicates that the declaring service supports routing of the - * system media. + * A category that indicates that the declaring service supports routing of the system media. * * <p>Providers must include this action if they intend to publish routes that support the * system media, as described by {@link MediaRoute2Info#getSupportedRoutingTypes()}. @@ -94,7 +100,7 @@ public abstract class MediaRoute2ProviderService extends Service { */ // TODO: b/362507305 - Unhide once the implementation and CTS are in place. @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2) - @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) + @SdkConstant(SdkConstant.SdkConstantType.INTENT_CATEGORY) public static final String SERVICE_INTERFACE_SYSTEM_MEDIA = "android.media.MediaRoute2ProviderService.SYSTEM_MEDIA"; @@ -165,6 +171,16 @@ public abstract class MediaRoute2ProviderService extends Service { @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2) public static final int REASON_UNIMPLEMENTED = 5; + /** + * The request has failed because the provider has failed to route system media. + * + * @see #notifyRequestFailed + * @hide + */ + // TODO: b/362507305 - Unhide once the implementation and CTS are in place. + @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2) + public static final int REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA = 6; + /** @hide */ @IntDef( prefix = "REASON_", @@ -174,7 +190,8 @@ public abstract class MediaRoute2ProviderService extends Service { REASON_NETWORK_ERROR, REASON_ROUTE_NOT_AVAILABLE, REASON_INVALID_COMMAND, - REASON_UNIMPLEMENTED + REASON_UNIMPLEMENTED, + REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA }) @Retention(RetentionPolicy.SOURCE) public @interface Reason {} @@ -187,15 +204,28 @@ public abstract class MediaRoute2ProviderService extends Service { private final AtomicBoolean mStatePublishScheduled = new AtomicBoolean(false); private final AtomicBoolean mSessionUpdateScheduled = new AtomicBoolean(false); private MediaRoute2ProviderServiceStub mStub; + /** Populated by system_server in {@link #setCallback}. Monotonically non-null. */ private IMediaRoute2ProviderServiceCallback mRemoteCallback; private volatile MediaRoute2ProviderInfo mProviderInfo; @GuardedBy("mRequestIdsLock") private final Deque<Long> mRequestIds = new ArrayDeque<>(MAX_REQUEST_IDS_SIZE); + /** + * Maps system media session creation request ids to a package uid whose media to route. The + * value may be {@link Process#INVALID_UID} for routing sessions that don't affect a specific + * package (for example, if they affect the entire system). + */ + @GuardedBy("mRequestIdsLock") + private final LongSparseArray<Integer> mSystemMediaSessionCreationRequests = + new LongSparseArray<>(); + @GuardedBy("mSessionLock") private final ArrayMap<String, RoutingSessionInfo> mSessionInfos = new ArrayMap<>(); + @GuardedBy("mSessionLock") + private final ArrayMap<String, MediaStreams> mOngoingMediaStreams = new ArrayMap<>(); + public MediaRoute2ProviderService() { mHandler = new Handler(Looper.getMainLooper()); } @@ -282,7 +312,7 @@ public abstract class MediaRoute2ProviderService extends Service { */ public final void notifySessionCreated(long requestId, @NonNull RoutingSessionInfo sessionInfo) { - Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); + requireNonNull(sessionInfo, "sessionInfo must not be null"); if (DEBUG) { Log.d(TAG, "notifySessionCreated: Creating a session. requestId=" + requestId @@ -326,17 +356,129 @@ public abstract class MediaRoute2ProviderService extends Service { * @param formats the {@link MediaStreamsFormats} that describes the format for the {@link * MediaStreams} to return. * @return a {@link MediaStreams} instance that holds the media streams to route as part of the - * newly created routing session. + * newly created routing session. May be null if system media capture failed, in which case + * you can ignore the return value, as you will receive a call to {@link #onReleaseSession} + * where you can clean up this session * @hide */ // TODO: b/362507305 - Unhide once the implementation and CTS are in place. @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2) - @NonNull + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) + @Nullable public final MediaStreams notifySystemMediaSessionCreated( long requestId, @NonNull RoutingSessionInfo sessionInfo, @NonNull MediaStreamsFormats formats) { - throw new UnsupportedOperationException(); + requireNonNull(sessionInfo, "sessionInfo must not be null"); + requireNonNull(formats, "formats must not be null"); + if (DEBUG) { + Log.d( + TAG, + "notifySystemMediaSessionCreated: Creating a session. requestId=" + + requestId + + ", sessionInfo=" + + sessionInfo); + } + + Integer uid; + synchronized (mRequestIdsLock) { + uid = mSystemMediaSessionCreationRequests.get(requestId); + mSystemMediaSessionCreationRequests.remove(requestId); + } + + if (uid == null) { + throw new IllegalStateException( + "Unexpected system routing session created (request id=" + + requestId + + "):" + + sessionInfo); + } + + if (mRemoteCallback == null) { + throw new IllegalStateException("Unexpected: remote callback is null."); + } + + int routingTypes = 0; + var providerInfo = mProviderInfo; + for (String selectedRouteId : sessionInfo.getSelectedRoutes()) { + MediaRoute2Info route = providerInfo.mRoutes.get(selectedRouteId); + if (route == null) { + throw new IllegalArgumentException( + "Invalid selected route with id: " + selectedRouteId); + } + routingTypes |= route.getSupportedRoutingTypes(); + } + + if ((routingTypes & MediaRoute2Info.FLAG_ROUTING_TYPE_SYSTEM_AUDIO) == 0) { + // TODO: b/380431086 - Populate video stream once we add support for video. + throw new IllegalArgumentException( + "Selected routes for system media don't support any system media routing" + + " types."); + } + + AudioFormat audioFormat = formats.mAudioFormat; + var mediaStreamsBuilder = new MediaStreams.Builder(); + if (audioFormat != null) { + populateAudioStream(audioFormat, uid, mediaStreamsBuilder); + } + // TODO: b/380431086 - Populate video stream once we add support for video. + + MediaStreams streams = mediaStreamsBuilder.build(); + var audioRecord = streams.mAudioRecord; + if (audioRecord == null) { + Log.e( + TAG, + "Audio record is not populated. Returning an empty stream and scheduling the" + + " session release for: " + + sessionInfo); + mHandler.post(() -> onReleaseSession(REQUEST_ID_NONE, sessionInfo.getOriginalId())); + notifyRequestFailed(requestId, REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA); + return null; + } + + synchronized (mSessionLock) { + try { + mRemoteCallback.notifySessionCreated(requestId, sessionInfo); + } catch (RemoteException ex) { + ex.rethrowFromSystemServer(); + } + mOngoingMediaStreams.put(sessionInfo.getOriginalId(), streams); + return streams; + } + } + + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) + private void populateAudioStream( + AudioFormat audioFormat, int uid, MediaStreams.Builder builder) { + var audioAttributes = + new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build(); + var audioMixingRuleBuilder = + new AudioMixingRule.Builder() + .addRule(audioAttributes, AudioMixingRule.RULE_MATCH_ATTRIBUTE_USAGE); + if (uid != Process.INVALID_UID) { + audioMixingRuleBuilder.addMixRule(AudioMixingRule.RULE_MATCH_UID, uid); + } + + AudioMix mix = + new AudioMix.Builder(audioMixingRuleBuilder.build()) + .setFormat(audioFormat) + .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK) + .build(); + AudioPolicy audioPolicy = + new AudioPolicy.Builder(this).setLooper(mHandler.getLooper()).addMix(mix).build(); + var audioManager = getSystemService(AudioManager.class); + if (audioManager == null) { + Log.e(TAG, "Couldn't fetch the audio manager."); + return; + } + audioManager.registerAudioPolicy(audioPolicy); + var audioRecord = audioPolicy.createAudioRecordSink(mix); + if (audioRecord == null) { + Log.e(TAG, "Audio record creation failed."); + audioManager.unregisterAudioPolicy(audioPolicy); + return; + } + builder.setAudioStream(audioPolicy, audioRecord); } /** @@ -344,7 +486,7 @@ public abstract class MediaRoute2ProviderService extends Service { * {@link RoutingSessionInfo#getSelectedRoutes() selected routes} are changed. */ public final void notifySessionUpdated(@NonNull RoutingSessionInfo sessionInfo) { - Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); + requireNonNull(sessionInfo, "sessionInfo must not be null"); if (DEBUG) { Log.d(TAG, "notifySessionUpdated: Updating session id=" + sessionInfo); @@ -379,6 +521,7 @@ public abstract class MediaRoute2ProviderService extends Service { RoutingSessionInfo sessionInfo; synchronized (mSessionLock) { sessionInfo = mSessionInfos.remove(sessionId); + maybeReleaseMediaStreams(sessionId); if (sessionInfo == null) { Log.w(TAG, "notifySessionReleased: Ignoring unknown session info."); @@ -396,6 +539,34 @@ public abstract class MediaRoute2ProviderService extends Service { } } + /** Releases any system media routing resources associated with the given {@code sessionId}. */ + private void maybeReleaseMediaStreams(String sessionId) { + if (!Flags.enableMirroringInMediaRouter2()) { + return; + } + synchronized (mSessionLock) { + var streams = mOngoingMediaStreams.remove(sessionId); + if (streams != null) { + releaseAudioStream(streams.mAudioPolicy, streams.mAudioRecord); + // TODO: b/380431086: Release the video stream once implemented. + } + } + } + + // We cannot reach the code that requires MODIFY_AUDIO_ROUTING without holding it. + @SuppressWarnings("MissingPermission") + private void releaseAudioStream(AudioPolicy audioPolicy, AudioRecord audioRecord) { + if (audioPolicy == null) { + return; + } + var audioManager = getSystemService(AudioManager.class); + if (audioManager == null) { + return; + } + audioRecord.stop(); + audioManager.unregisterAudioPolicy(audioPolicy); + } + /** * Notifies to the client that the request has failed. * @@ -569,7 +740,7 @@ public abstract class MediaRoute2ProviderService extends Service { * Updates routes of the provider and notifies the system media router service. */ public final void notifyRoutes(@NonNull Collection<MediaRoute2Info> routes) { - Objects.requireNonNull(routes, "routes must not be null"); + requireNonNull(routes, "routes must not be null"); List<MediaRoute2Info> sanitizedRoutes = new ArrayList<>(routes.size()); for (MediaRoute2Info route : routes) { @@ -763,6 +934,32 @@ public abstract class MediaRoute2ProviderService extends Service { } @Override + public void requestCreateSystemMediaSession( + long requestId, + int uid, + String packageName, + String routeId, + @Nullable Bundle sessionHints) { + if (!checkCallerIsSystem()) { + return; + } + if (!checkRouteIdIsValid(routeId, "requestCreateSession")) { + return; + } + synchronized (mRequestIdsLock) { + mSystemMediaSessionCreationRequests.put(requestId, uid); + } + mHandler.sendMessage( + obtainMessage( + MediaRoute2ProviderService::onCreateSystemRoutingSession, + MediaRoute2ProviderService.this, + requestId, + packageName, + routeId, + sessionHints)); + } + + @Override public void selectRoute(long requestId, String sessionId, String routeId) { if (!checkCallerIsSystem()) { return; @@ -825,6 +1022,10 @@ public abstract class MediaRoute2ProviderService extends Service { if (!checkSessionIdIsValid(sessionId, "releaseSession")) { return; } + // We proactively release the system media routing once the system requests it, to + // ensure it happens immediately. + maybeReleaseMediaStreams(sessionId); + addRequestId(requestId); mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onReleaseSession, MediaRoute2ProviderService.this, requestId, sessionId)); @@ -843,12 +1044,14 @@ public abstract class MediaRoute2ProviderService extends Service { @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2) public static final class MediaStreams { - private final AudioRecord mAudioRecord; + @Nullable private final AudioPolicy mAudioPolicy; + @Nullable private final AudioRecord mAudioRecord; // TODO: b/380431086: Add the video equivalent. - private MediaStreams(AudioRecord mAudioRecord) { - this.mAudioRecord = mAudioRecord; + private MediaStreams(Builder builder) { + this.mAudioPolicy = builder.mAudioPolicy; + this.mAudioRecord = builder.mAudioRecord; } /** @@ -859,8 +1062,33 @@ public abstract class MediaRoute2ProviderService extends Service { public AudioRecord getAudioRecord() { return mAudioRecord; } + + /** + * Builder for {@link MediaStreams}. + * + * @hide + */ + public static final class Builder { + + @Nullable private AudioPolicy mAudioPolicy; + @Nullable private AudioRecord mAudioRecord; + + /** Populates system media audio-related structures. */ + public Builder setAudioStream( + @NonNull AudioPolicy audioPolicy, @NonNull AudioRecord audioRecord) { + mAudioPolicy = requireNonNull(audioPolicy); + mAudioRecord = requireNonNull(audioRecord); + return this; + } + + /** Builds a {@link MediaStreams} instance. */ + public MediaStreams build() { + return new MediaStreams(this); + } + } } + /** * Holds the formats to encode media data to be read from {@link MediaStreams}. * @@ -911,7 +1139,7 @@ public abstract class MediaRoute2ProviderService extends Service { */ @NonNull public Builder setAudioFormat(@NonNull AudioFormat audioFormat) { - this.mAudioFormat = Objects.requireNonNull(audioFormat); + this.mAudioFormat = requireNonNull(audioFormat); return this; } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 20108e7369d7..3ac5de38f886 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -809,7 +809,7 @@ public final class MediaRouter2 { * updates} in order to keep the system UI in a consistent state. You can also call this method * at any other point to update the listing preference dynamically. * - * <p>Any calls to this method from a privileged router will throw an {@link + * <p>Calling this method on a proxy router instance will throw an {@link * UnsupportedOperationException}. * * <p>Notes: @@ -2675,7 +2675,7 @@ public final class MediaRouter2 { @Override public void setRouteListingPreference(@Nullable RouteListingPreference preference) { throw new UnsupportedOperationException( - "RouteListingPreference cannot be set by a privileged MediaRouter2 instance."); + "RouteListingPreference cannot be set by a proxy MediaRouter2 instance."); } @Override diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index fc184fe5c872..8419ce761a4a 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -1149,9 +1149,9 @@ status_t JMediaCodec::unsubscribeFromVendorParameters(JNIEnv *env, jobject names static jobject getJavaResources( JNIEnv *env, - const std::vector<MediaCodec::InstanceResourceInfo>& resources) { + const std::vector<InstanceResourceInfo>& resources) { jobject resourcesObj = env->NewObject(gArrayListInfo.clazz, gArrayListInfo.ctorId); - for (const MediaCodec::InstanceResourceInfo& res : resources) { + for (const InstanceResourceInfo& res : resources) { ScopedLocalRef<jobject> object{env, env->NewObject( gInstanceResourceInfo.clazz, gInstanceResourceInfo.ctorId)}; ScopedLocalRef<jstring> nameStr{env, env->NewStringUTF(res.mName.c_str())}; @@ -1169,7 +1169,7 @@ static jobject getJavaResources( } status_t JMediaCodec::getRequiredResources(JNIEnv *env, jobject *resourcesObj) { - std::vector<MediaCodec::InstanceResourceInfo> resources; + std::vector<InstanceResourceInfo> resources; status_t status = mCodec->getRequiredResources(resources); if (status != OK) { return status; @@ -3615,9 +3615,9 @@ static void android_media_MediaCodec_unsubscribeFromVendorParameters( static jobject getJavaResources( JNIEnv *env, - const std::vector<MediaCodec::GlobalResourceInfo>& resources) { + const std::vector<GlobalResourceInfo>& resources) { jobject resourcesObj = env->NewObject(gArrayListInfo.clazz, gArrayListInfo.ctorId); - for (const MediaCodec::GlobalResourceInfo& res : resources) { + for (const GlobalResourceInfo& res : resources) { ScopedLocalRef<jobject> object{env, env->NewObject( gGlobalResourceInfo.clazz, gGlobalResourceInfo.ctorId)}; ScopedLocalRef<jstring> nameStr{env, env->NewStringUTF(res.mName.c_str())}; @@ -3633,7 +3633,7 @@ static jobject getJavaResources( static jobject android_media_MediaCodec_getGloballyAvailableResources( JNIEnv *env, jobject thiz) { (void)thiz; - std::vector<MediaCodec::GlobalResourceInfo> resources; + std::vector<GlobalResourceInfo> resources; status_t status = MediaCodec::getGloballyAvailableResources(resources); if (status != OK) { if (status == ERROR_UNSUPPORTED) { diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp index 1945d90568b3..9257901bcd1f 100644 --- a/native/android/performance_hint.cpp +++ b/native/android/performance_hint.cpp @@ -22,6 +22,7 @@ #include <aidl/android/hardware/power/SessionHint.h> #include <aidl/android/hardware/power/SessionMode.h> #include <aidl/android/hardware/power/SessionTag.h> +#include <aidl/android/hardware/power/SupportInfo.h> #include <aidl/android/hardware/power/WorkDuration.h> #include <aidl/android/hardware/power/WorkDurationFixedV1.h> #include <aidl/android/os/IHintManager.h> @@ -148,10 +149,36 @@ private: std::future<bool> mChannelCreationFinished; }; +class SupportInfoWrapper { +public: + SupportInfoWrapper(hal::SupportInfo& info); + bool isSessionModeSupported(hal::SessionMode mode); + bool isSessionHintSupported(hal::SessionHint hint); + +private: + template <class T> + bool getEnumSupportFromBitfield(T& enumValue, int64_t& supportBitfield) { + // extract the bit corresponding to the enum by shifting the bitfield + // over that much and cutting off any extra values + return (supportBitfield >> static_cast<int>(enumValue)) % 2; + } + hal::SupportInfo mSupportInfo; +}; + +class HintManagerClient : public IHintManager::BnHintManagerClient { +public: + // Currently a no-op that exists for FMQ init to call in the future + ndk::ScopedAStatus receiveChannelConfig(const hal::ChannelConfig&) { + return ndk::ScopedAStatus::ok(); + } +}; + struct APerformanceHintManager { public: static APerformanceHintManager* getInstance(); - APerformanceHintManager(std::shared_ptr<IHintManager>& service, int64_t preferredRateNanos); + APerformanceHintManager(std::shared_ptr<IHintManager>& service, + IHintManager::HintManagerClientData&& clientData, + std::shared_ptr<HintManagerClient> callbackClient); APerformanceHintManager() = delete; ~APerformanceHintManager(); @@ -169,29 +196,21 @@ public: FMQWrapper& getFMQWrapper(); bool canSendLoadHints(std::vector<hal::SessionHint>& hints, int64_t now) REQUIRES(sHintMutex); void initJava(JNIEnv* _Nonnull env); - ndk::ScopedAIBinder_Weak x; template <class T> static void layersFromNativeSurfaces(ANativeWindow** windows, int numWindows, ASurfaceControl** controls, int numSurfaceControls, std::vector<T>& out); + ndk::SpAIBinder& getToken(); + SupportInfoWrapper& getSupportInfo(); private: - // Necessary to create an empty binder object - static void* tokenStubOnCreate(void*) { - return nullptr; - } - static void tokenStubOnDestroy(void*) {} - static binder_status_t tokenStubOnTransact(AIBinder*, transaction_code_t, const AParcel*, - AParcel*) { - return STATUS_OK; - } - static APerformanceHintManager* create(std::shared_ptr<IHintManager> iHintManager); std::shared_ptr<IHintManager> mHintManager; + std::shared_ptr<HintManagerClient> mCallbackClient; + IHintManager::HintManagerClientData mClientData; + SupportInfoWrapper mSupportInfoWrapper; ndk::SpAIBinder mToken; - const int64_t mPreferredRateNanos; - std::optional<int32_t> mMaxGraphicsPipelineThreadsCount; FMQWrapper mFMQWrapper; double mHintBudget = kMaxLoadHintsPerInterval; int64_t mLastBudgetReplenish = 0; @@ -273,14 +292,27 @@ static FMQWrapper& getFMQ() { return APerformanceHintManager::getInstance()->getFMQWrapper(); } +// ===================================== SupportInfoWrapper implementation + +SupportInfoWrapper::SupportInfoWrapper(hal::SupportInfo& info) : mSupportInfo(info) {} + +bool SupportInfoWrapper::isSessionHintSupported(hal::SessionHint hint) { + return getEnumSupportFromBitfield(hint, mSupportInfo.sessionHints); +} + +bool SupportInfoWrapper::isSessionModeSupported(hal::SessionMode mode) { + return getEnumSupportFromBitfield(mode, mSupportInfo.sessionModes); +} + // ===================================== APerformanceHintManager implementation APerformanceHintManager::APerformanceHintManager(std::shared_ptr<IHintManager>& manager, - int64_t preferredRateNanos) - : mHintManager(std::move(manager)), mPreferredRateNanos(preferredRateNanos) { - static AIBinder_Class* tokenBinderClass = - AIBinder_Class_define("phm_token", tokenStubOnCreate, tokenStubOnDestroy, - tokenStubOnTransact); - mToken = ndk::SpAIBinder(AIBinder_new(tokenBinderClass, nullptr)); + IHintManager::HintManagerClientData&& clientData, + std::shared_ptr<HintManagerClient> callbackClient) + : mHintManager(std::move(manager)), + mCallbackClient(callbackClient), + mClientData(clientData), + mSupportInfoWrapper(clientData.supportInfo), + mToken(callbackClient->asBinder()) { if (mFMQWrapper.isSupported()) { mFMQWrapper.setToken(mToken); mFMQWrapper.startChannel(mHintManager.get()); @@ -315,16 +347,17 @@ APerformanceHintManager* APerformanceHintManager::create(std::shared_ptr<IHintMa ALOGE("%s: PerformanceHint service is not ready ", __FUNCTION__); return nullptr; } - int64_t preferredRateNanos = -1L; - ndk::ScopedAStatus ret = manager->getHintSessionPreferredRate(&preferredRateNanos); + std::shared_ptr<HintManagerClient> client = ndk::SharedRefBase::make<HintManagerClient>(); + IHintManager::HintManagerClientData clientData; + ndk::ScopedAStatus ret = manager->registerClient(client, &clientData); if (!ret.isOk()) { - ALOGE("%s: PerformanceHint cannot get preferred rate. %s", __FUNCTION__, ret.getMessage()); + ALOGE("%s: PerformanceHint is not supported. %s", __FUNCTION__, ret.getMessage()); return nullptr; } - if (preferredRateNanos <= 0) { - preferredRateNanos = -1L; + if (clientData.preferredRateNanos <= 0) { + clientData.preferredRateNanos = -1L; } - return new APerformanceHintManager(manager, preferredRateNanos); + return new APerformanceHintManager(manager, std::move(clientData), client); } bool APerformanceHintManager::canSendLoadHints(std::vector<hal::SessionHint>& hints, int64_t now) { @@ -389,7 +422,9 @@ APerformanceHintSession* APerformanceHintManager::createSessionUsingConfig( ALOGE("%s: PerformanceHint cannot create session. %s", __FUNCTION__, ret.getMessage()); return nullptr; } - auto out = new APerformanceHintSession(mHintManager, std::move(session), mPreferredRateNanos, + + auto out = new APerformanceHintSession(mHintManager, std::move(session), + mClientData.preferredRateNanos, sessionCreationConfig->targetWorkDurationNanos, isJava, sessionConfig.id == -1 ? std::nullopt @@ -416,24 +451,11 @@ APerformanceHintSession* APerformanceHintManager::getSessionFromJava(JNIEnv* env } int64_t APerformanceHintManager::getPreferredRateNanos() const { - return mPreferredRateNanos; + return mClientData.preferredRateNanos; } int32_t APerformanceHintManager::getMaxGraphicsPipelineThreadsCount() { - if (!mMaxGraphicsPipelineThreadsCount.has_value()) { - int32_t threadsCount = -1; - ndk::ScopedAStatus ret = mHintManager->getMaxGraphicsPipelineThreadsCount(&threadsCount); - if (!ret.isOk()) { - ALOGE("%s: PerformanceHint cannot get max graphics pipeline threads count. %s", - __FUNCTION__, ret.getMessage()); - return -1; - } - if (threadsCount <= 0) { - threadsCount = -1; - } - mMaxGraphicsPipelineThreadsCount.emplace(threadsCount); - } - return mMaxGraphicsPipelineThreadsCount.value(); + return mClientData.maxGraphicsPipelineThreads; } FMQWrapper& APerformanceHintManager::getFMQWrapper() { @@ -450,6 +472,14 @@ void APerformanceHintManager::initJava(JNIEnv* _Nonnull env) { mJavaInitialized = true; } +ndk::SpAIBinder& APerformanceHintManager::getToken() { + return mToken; +} + +SupportInfoWrapper& APerformanceHintManager::getSupportInfo() { + return mSupportInfoWrapper; +} + // ===================================== APerformanceHintSession implementation constexpr int kNumEnums = enum_size<hal::SessionHint>(); @@ -1170,7 +1200,7 @@ int APerformanceHint_notifyWorkloadSpike(APerformanceHintSession* session, bool if (!useNewLoadHintBehavior()) { return ENOTSUP; } - return session->notifyWorkloadReset(cpu, gpu, debugName); + return session->notifyWorkloadSpike(cpu, gpu, debugName); } int APerformanceHint_setNativeSurfaces(APerformanceHintSession* session, diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp index c166e738ffb2..e3c10f63abb4 100644 --- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp +++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp @@ -56,9 +56,6 @@ public: const SessionCreationConfig& creationConfig, hal::SessionConfig* config, std::shared_ptr<IHintSession>* _aidl_return), (override)); - MOCK_METHOD(ScopedAStatus, getHintSessionPreferredRate, (int64_t * _aidl_return), (override)); - MOCK_METHOD(ScopedAStatus, getMaxGraphicsPipelineThreadsCount, (int32_t* _aidl_return), - (override)); MOCK_METHOD(ScopedAStatus, setHintSessionThreads, (const std::shared_ptr<IHintSession>& hintSession, const ::std::vector<int32_t>& tids), @@ -84,6 +81,11 @@ public: MOCK_METHOD(ScopedAStatus, getGpuHeadroomMinIntervalMillis, (int64_t* _aidl_return), (override)); MOCK_METHOD(ScopedAStatus, passSessionManagerBinder, (const SpAIBinder& sessionManager)); + MOCK_METHOD(ScopedAStatus, registerClient, + (const std::shared_ptr<::aidl::android::os::IHintManager::IHintManagerClient>& + clientDataIn, + ::aidl::android::os::IHintManager::HintManagerClientData* _aidl_return), + (override)); MOCK_METHOD(SpAIBinder, asBinder, (), (override)); MOCK_METHOD(bool, isRemote, (), (override)); }; @@ -125,10 +127,9 @@ public: APerformanceHintManager* createManager() { APerformanceHint_setUseFMQForTesting(mUsingFMQ); - ON_CALL(*mMockIHintManager, getHintSessionPreferredRate(_)) - .WillByDefault(DoAll(SetArgPointee<0>(123L), [] { return ScopedAStatus::ok(); })); - ON_CALL(*mMockIHintManager, getMaxGraphicsPipelineThreadsCount(_)) - .WillByDefault(DoAll(SetArgPointee<0>(5), [] { return ScopedAStatus::ok(); })); + ON_CALL(*mMockIHintManager, registerClient(_, _)) + .WillByDefault( + DoAll(SetArgPointee<1>(mClientData), [] { return ScopedAStatus::ok(); })); return APerformanceHint_getManager(); } @@ -238,6 +239,20 @@ public: int kMockQueueSize = 20; bool mUsingFMQ = false; + IHintManager::HintManagerClientData mClientData{ + .powerHalVersion = 6, + .maxGraphicsPipelineThreads = 5, + .preferredRateNanos = 123L, + .supportInfo{ + .usesSessions = true, + .boosts = 0, + .modes = 0, + .sessionHints = -1, + .sessionModes = -1, + .sessionTags = -1, + }, + }; + int32_t mMaxLoadHintsPerInterval; int64_t mLoadHintInterval; @@ -256,12 +271,6 @@ bool equalsWithoutTimestamp(hal::WorkDuration lhs, hal::WorkDuration rhs) { lhs.gpuDurationNanos == rhs.gpuDurationNanos && lhs.durationNanos == rhs.durationNanos; } -TEST_F(PerformanceHintTest, TestGetPreferredUpdateRateNanos) { - APerformanceHintManager* manager = createManager(); - int64_t preferredUpdateRateNanos = APerformanceHint_getPreferredUpdateRateNanos(manager); - EXPECT_EQ(123L, preferredUpdateRateNanos); -} - TEST_F(PerformanceHintTest, TestSession) { APerformanceHintManager* manager = createManager(); APerformanceHintSession* session = createSession(manager); diff --git a/nfc/Android.bp b/nfc/Android.bp index abe0ab757ba6..b82dec88993d 100644 --- a/nfc/Android.bp +++ b/nfc/Android.bp @@ -71,6 +71,7 @@ java_sdk_library { "//cts/hostsidetests/multidevices/nfc:__subpackages__", "//cts/tests/tests/nfc", "//packages/apps/Nfc:__subpackages__", + "//packages/modules/Nfc:__subpackages__", ], jarjar_rules: ":nfc-jarjar-rules", lint: { diff --git a/nfc/OWNERS b/nfc/OWNERS index 35e9713f5715..f46dccd97974 100644 --- a/nfc/OWNERS +++ b/nfc/OWNERS @@ -1,2 +1,2 @@ # Bug component: 48448 -include platform/packages/apps/Nfc:/OWNERS +include platform/packages/apps/Nfc:/OWNERS
\ No newline at end of file diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt index cf11ac028858..6bd6072a2f43 100644 --- a/nfc/api/system-current.txt +++ b/nfc/api/system-current.txt @@ -200,9 +200,11 @@ package android.nfc { method @Nullable @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @WorkerThread public android.nfc.T4tNdefNfceeCcFileInfo readCcfile(); method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @WorkerThread public byte[] readData(@IntRange(from=0, to=65535) int); method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @WorkerThread public int writeData(@IntRange(from=0, to=65535) int, @NonNull byte[]); + field public static final int CLEAR_DATA_FAILED_DEVICE_BUSY = -1; // 0xffffffff field public static final int CLEAR_DATA_FAILED_INTERNAL = 0; // 0x0 field public static final int CLEAR_DATA_SUCCESS = 1; // 0x1 field public static final int WRITE_DATA_ERROR_CONNECTION_FAILED = -6; // 0xfffffffa + field public static final int WRITE_DATA_ERROR_DEVICE_BUSY = -9; // 0xfffffff7 field public static final int WRITE_DATA_ERROR_EMPTY_PAYLOAD = -7; // 0xfffffff9 field public static final int WRITE_DATA_ERROR_INTERNAL = -1; // 0xffffffff field public static final int WRITE_DATA_ERROR_INVALID_FILE_ID = -4; // 0xfffffffc @@ -217,21 +219,14 @@ package android.nfc { method public int describeContents(); method @IntRange(from=15, to=32767) public int getCcFileLength(); method @IntRange(from=0xffffffff, to=65535) public int getFileId(); - method @IntRange(from=15, to=65535) public int getMaxReadLength(); method @IntRange(from=5, to=32767) public int getMaxSize(); - method @IntRange(from=13, to=65535) public int getMaxWriteLength(); - method public int getReadAccess(); method public int getVersion(); - method public int getWriteAccess(); + method public boolean isReadAllowed(); + method public boolean isWriteAllowed(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.nfc.T4tNdefNfceeCcFileInfo> CREATOR; - field public static final int READ_ACCESS_GRANTED_RESTRICTED = 128; // 0x80 - field public static final int READ_ACCESS_GRANTED_UNRESTRICTED = 0; // 0x0 field public static final int VERSION_2_0 = 32; // 0x20 field public static final int VERSION_3_0 = 48; // 0x30 - field public static final int WRITE_ACCESS_GRANTED_RESTRICTED = 128; // 0x80 - field public static final int WRITE_ACCESS_GRANTED_UNRESTRICTED = 0; // 0x0 - field public static final int WRITE_ACCESS_NOT_GRANTED = 255; // 0xff } } diff --git a/nfc/java/android/nfc/T4tNdefNfcee.java b/nfc/java/android/nfc/T4tNdefNfcee.java index 06d02c54eb2e..05a30aad76fc 100644 --- a/nfc/java/android/nfc/T4tNdefNfcee.java +++ b/nfc/java/android/nfc/T4tNdefNfcee.java @@ -100,9 +100,14 @@ public final class T4tNdefNfcee { public static final int WRITE_DATA_ERROR_EMPTY_PAYLOAD = -7; /** * Returns flag for {@link #writeData(int, byte[])}. - * It idicates write data fail due to invalid ndef format. + * It indicates write data fail due to invalid ndef format. */ public static final int WRITE_DATA_ERROR_NDEF_VALIDATION_FAILED = -8; + /** + * Returns flag for {@link #writeData(int, byte[])}. + * It indicates write data fail if a concurrent NDEF NFCEE operation is ongoing. + */ + public static final int WRITE_DATA_ERROR_DEVICE_BUSY = -9; /** * Possible return values for {@link #writeData(int, byte[])}. @@ -119,6 +124,7 @@ public final class T4tNdefNfcee { WRITE_DATA_ERROR_CONNECTION_FAILED, WRITE_DATA_ERROR_EMPTY_PAYLOAD, WRITE_DATA_ERROR_NDEF_VALIDATION_FAILED, + WRITE_DATA_ERROR_DEVICE_BUSY, }) @Retention(RetentionPolicy.SOURCE) public @interface WriteDataStatus{} @@ -128,6 +134,9 @@ public final class T4tNdefNfcee { * * <p>This is an I/O operation and will block until complete. It must * not be called from the main application thread.</p> + * <p>Applications must send complete Ndef Message payload, do not need to fragment + * the payload, it will be automatically fragmented and defragmented by + * {@link #writeData} if it exceeds max message length limits</p> * * @param fileId File id (Refer NFC Forum Type 4 Tag Specification * Section 4.2 File Identifiers and Access Conditions @@ -155,9 +164,10 @@ public final class T4tNdefNfcee { * @param fileId File Id (Refer * Section 4.2 File Identifiers and Access Conditions * for more information) from which to read. - * @return - Returns Ndef message if success + * @return - Returns complete Ndef message if success * Refer to Nfc forum NDEF specification NDEF Message section - * @throws IllegalStateException if read fails because the fileId is invalid. + * @throws IllegalStateException if read fails because the fileId is invalid + * or if a concurrent operation is in progress. * @hide */ @SystemApi @@ -179,6 +189,12 @@ public final class T4tNdefNfcee { * It indicates clear data failed due to internal error while processing the clear. */ public static final int CLEAR_DATA_FAILED_INTERNAL = 0; + /** + * Return flag for {@link #clearNdefData()}. + * It indicates clear data failed if a concurrent NDEF NFCEE operation is ongoing. + */ + public static final int CLEAR_DATA_FAILED_DEVICE_BUSY = -1; + /** * Possible return values for {@link #clearNdefData()}. @@ -188,6 +204,7 @@ public final class T4tNdefNfcee { @IntDef(prefix = { "CLEAR_DATA_" }, value = { CLEAR_DATA_SUCCESS, CLEAR_DATA_FAILED_INTERNAL, + CLEAR_DATA_FAILED_DEVICE_BUSY, }) @Retention(RetentionPolicy.SOURCE) public @interface ClearDataStatus{} @@ -245,6 +262,7 @@ public final class T4tNdefNfcee { * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" for more details. * * @return Returns CC file content if success or null if failed to read. + * @throws IllegalStateException if the device is busy. * @hide */ @SystemApi diff --git a/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java b/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java index 5fca0529124e..ce67f8f9aea7 100644 --- a/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java +++ b/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java @@ -47,14 +47,6 @@ public final class T4tNdefNfceeCcFileInfo implements Parcelable { */ private int mVersion; /** - * Indicates the max data size by a single ReadBinary<p> - */ - private int mMaxReadLength; - /** - * Indicates the max data size by a single UpdateBinary<p> - */ - private int mMaxWriteLength; - /** * Indicates the NDEF File Identifier<p> */ private int mFileId; @@ -65,40 +57,35 @@ public final class T4tNdefNfceeCcFileInfo implements Parcelable { /** * Indicates the read access condition<p> */ - private int mReadAccess; + private boolean mIsReadAllowed; /** * Indicates the write access condition<p> */ - private int mWriteAccess; + private boolean mIsWriteAllowed; /** * Constructor to be used by NFC service and internal classes. * @hide */ - public T4tNdefNfceeCcFileInfo(int cclen, int version, int maxLe, int maxLc, + public T4tNdefNfceeCcFileInfo(int cclen, int version, int ndefFileId, int ndefMaxSize, - int ndefReadAccess, int ndefWriteAccess) { + boolean isReadAllowed, boolean isWriteAllowed) { mCcLength = cclen; mVersion = version; - mMaxWriteLength = maxLc; - mMaxReadLength = maxLe; mFileId = ndefFileId; mMaxSize = ndefMaxSize; - mReadAccess = ndefReadAccess; - mWriteAccess = ndefWriteAccess; + mIsReadAllowed = isReadAllowed; + mIsWriteAllowed = isWriteAllowed; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(mCcLength); dest.writeInt(mVersion); - dest.writeInt(mMaxWriteLength); - dest.writeInt(mMaxReadLength); dest.writeInt(mFileId); dest.writeInt(mMaxSize); - dest.writeInt(mReadAccess); - dest.writeInt(mWriteAccess); + dest.writeBoolean(mIsReadAllowed); + dest.writeBoolean(mIsWriteAllowed); } /** @@ -146,30 +133,6 @@ public final class T4tNdefNfceeCcFileInfo implements Parcelable { } /** - * Indicates the max data size that can be read by a single invocation of - * {@link T4tNdefNfcee#readData(int)}. - * - * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" MLe. - * @return max size of read (in bytes). - */ - @IntRange(from = 0xf, to = 0xffff) - public int getMaxReadLength() { - return mMaxReadLength; - } - - /** - * Indicates the max data size that can be written by a single invocation of - * {@link T4tNdefNfcee#writeData(int, byte[])} - * - * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" MLc. - * @return max size of write (in bytes). - */ - @IntRange(from = 0xd, to = 0xffff) - public int getMaxWriteLength() { - return mMaxWriteLength; - } - - /** * Indicates the NDEF File Identifier. This is the identifier used in the last invocation of * {@link T4tNdefNfcee#writeData(int, byte[])} * @@ -191,73 +154,21 @@ public final class T4tNdefNfceeCcFileInfo implements Parcelable { } /** - * T4T tag read access granted without any security. - * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. - */ - public static final int READ_ACCESS_GRANTED_UNRESTRICTED = 0x0; - /** - * T4T tag read access granted with limited proprietary access only. - * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. - */ - public static final int READ_ACCESS_GRANTED_RESTRICTED = 0x80; - - /** - * Possible return values for {@link #getVersion()}. - * @hide - */ - @IntDef(prefix = { "READ_ACCESS_GRANTED_" }, value = { - READ_ACCESS_GRANTED_RESTRICTED, - READ_ACCESS_GRANTED_UNRESTRICTED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ReadAccess {} - - /** * Indicates the read access condition. * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. - * @return read access restriction + * @return boolean true if read access is allowed, otherwise false. */ - @ReadAccess - public int getReadAccess() { - return mReadAccess; + public boolean isReadAllowed() { + return mIsReadAllowed; } /** - * T4T tag write access granted without any security. - * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. - */ - public static final int WRITE_ACCESS_GRANTED_UNRESTRICTED = 0x0; - /** - * T4T tag write access granted with limited proprietary access only. - * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. - */ - public static final int WRITE_ACCESS_GRANTED_RESTRICTED = 0x80; - /** - * T4T tag write access not granted. - * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. - */ - public static final int WRITE_ACCESS_NOT_GRANTED = 0xFF; - - /** - * Possible return values for {@link #getVersion()}. - * @hide - */ - @IntDef(prefix = { "READ_ACCESS_GRANTED_" }, value = { - WRITE_ACCESS_GRANTED_RESTRICTED, - WRITE_ACCESS_GRANTED_UNRESTRICTED, - WRITE_ACCESS_NOT_GRANTED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface WriteAccess {} - - /** * Indicates the write access condition. * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. - * @return write access restriction + * @return boolean if write access is allowed, otherwise false. */ - @WriteAccess - public int getWriteAccess() { - return mWriteAccess; + public boolean isWriteAllowed() { + return mIsWriteAllowed; } @Override @@ -273,16 +184,14 @@ public final class T4tNdefNfceeCcFileInfo implements Parcelable { // NdefNfceeCcFileInfo fields int cclen = in.readInt(); int version = in.readInt(); - int maxLe = in.readInt(); - int maxLc = in.readInt(); int ndefFileId = in.readInt(); int ndefMaxSize = in.readInt(); - int ndefReadAccess = in.readInt(); - int ndefWriteAccess = in.readInt(); + boolean isReadAllowed = in.readBoolean(); + boolean isWriteAllowed = in.readBoolean(); - return new T4tNdefNfceeCcFileInfo(cclen, version, maxLe, maxLc, + return new T4tNdefNfceeCcFileInfo(cclen, version, ndefFileId, ndefMaxSize, - ndefReadAccess, ndefWriteAccess); + isReadAllowed, isWriteAllowed); } @Override diff --git a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java index 308b5d1831a6..7f64dbea0be3 100644 --- a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -174,7 +174,7 @@ public final class ApduServiceInfo implements Parcelable { * Whether or not this service wants to share the same routing priority as the * Wallet role owner. */ - private boolean mShareRolePriority; + private boolean mWantsRoleHolderPriority; /** * @hide @@ -314,8 +314,8 @@ public final class ApduServiceInfo implements Parcelable { R.styleable.HostApduService_shouldDefaultToObserveMode, false); if (Flags.nfcAssociatedRoleServices()) { - mShareRolePriority = sa.getBoolean( - R.styleable.HostApduService_shareRolePriority, + mWantsRoleHolderPriority = sa.getBoolean( + R.styleable.HostApduService_wantsRoleHolderPriority, false ); } @@ -350,8 +350,8 @@ public final class ApduServiceInfo implements Parcelable { } mStaticOffHostName = mOffHostName; if (Flags.nfcAssociatedRoleServices()) { - mShareRolePriority = sa.getBoolean( - R.styleable.OffHostApduService_shareRolePriority, + mWantsRoleHolderPriority = sa.getBoolean( + R.styleable.OffHostApduService_wantsRoleHolderPriority, false ); } @@ -752,8 +752,8 @@ public final class ApduServiceInfo implements Parcelable { * @return whether or not this service wants to share priority */ @FlaggedApi(Flags.FLAG_NFC_ASSOCIATED_ROLE_SERVICES) - public boolean shareRolePriority() { - return mShareRolePriority; + public boolean wantsRoleHolderPriority() { + return mWantsRoleHolderPriority; } /** diff --git a/nfc/java/android/nfc/cardemulation/HostApduService.java b/nfc/java/android/nfc/cardemulation/HostApduService.java index db1f6a2bb3b1..fbf2203b40b4 100644 --- a/nfc/java/android/nfc/cardemulation/HostApduService.java +++ b/nfc/java/android/nfc/cardemulation/HostApduService.java @@ -289,7 +289,7 @@ public abstract class HostApduService extends Service { try { mNfcService.send(responseMsg); } catch (RemoteException e) { - Log.e("TAG", "Response not sent; RemoteException calling into " + + Log.e(TAG, "Response not sent; RemoteException calling into " + "NfcService."); } } diff --git a/nfc/java/android/nfc/cardemulation/OWNERS b/nfc/java/android/nfc/cardemulation/OWNERS deleted file mode 100644 index 35e9713f5715..000000000000 --- a/nfc/java/android/nfc/cardemulation/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# Bug component: 48448 -include platform/packages/apps/Nfc:/OWNERS diff --git a/nfc/java/android/nfc/dta/OWNERS b/nfc/java/android/nfc/dta/OWNERS deleted file mode 100644 index 35e9713f5715..000000000000 --- a/nfc/java/android/nfc/dta/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# Bug component: 48448 -include platform/packages/apps/Nfc:/OWNERS diff --git a/nfc/java/android/nfc/tech/OWNERS b/nfc/java/android/nfc/tech/OWNERS deleted file mode 100644 index 35e9713f5715..000000000000 --- a/nfc/java/android/nfc/tech/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# Bug component: 48448 -include platform/packages/apps/Nfc:/OWNERS diff --git a/nfc/tests/src/android/nfc/cardemulation/AidGroupTest.java b/nfc/tests/src/android/nfc/cardemulation/AidGroupTest.java new file mode 100644 index 000000000000..7e0010247ee7 --- /dev/null +++ b/nfc/tests/src/android/nfc/cardemulation/AidGroupTest.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.nfc.cardemulation; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class AidGroupTest { + private AidGroup mAidGroup; + + @Before + public void setUp() { + List<String> aids = new ArrayList<>(); + aids.add("A0000000031010"); + aids.add("A0000000041010"); + aids.add("A0000000034710"); + aids.add("A000000300"); + mAidGroup = new AidGroup(aids, "payment"); + } + + @After + public void tearDown() { + } + + @Test + public void testGetCategory() { + String category = mAidGroup.getCategory(); + assertThat(category).isNotNull(); + assertThat(category).isEqualTo("payment"); + } + + @Test + public void testGetAids() { + List<String> aids = mAidGroup.getAids(); + assertThat(aids).isNotNull(); + assertThat(aids.size()).isGreaterThan(0); + assertThat(aids.get(0)).isEqualTo("A0000000031010"); + } + + @Test + public void testWriteAsXml() throws IOException { + XmlSerializer out = mock(XmlSerializer.class); + mAidGroup.writeAsXml(out); + verify(out, atLeastOnce()).startTag(isNull(), anyString()); + verify(out, atLeastOnce()).attribute(isNull(), anyString(), anyString()); + verify(out, atLeastOnce()).endTag(isNull(), anyString()); + } + + @Test + public void testRightToParcel() { + Parcel parcel = mock(Parcel.class); + mAidGroup.writeToParcel(parcel, 0); + verify(parcel).writeString8(anyString()); + verify(parcel).writeInt(anyInt()); + verify(parcel).writeStringList(any()); + } +} diff --git a/packages/CompanionDeviceManager/res/values/strings.xml b/packages/CompanionDeviceManager/res/values/strings.xml index b266912ca156..2a6d68d1ee35 100644 --- a/packages/CompanionDeviceManager/res/values/strings.xml +++ b/packages/CompanionDeviceManager/res/values/strings.xml @@ -88,6 +88,17 @@ <!-- Description of the helper dialog for NEARBY_DEVICE_STREAMING profile. [CHAR LIMIT=NONE] --> <string name="helper_summary_nearby_device_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> is requesting permission on behalf of <xliff:g id="device_name" example="Chromebook">%2$s</xliff:g> to stream apps from your <xliff:g id="device_type" example="phone">%3$s</xliff:g></string> + <!-- ================= DEVICE_PROFILE_SENSOR_DEVICE_STREAMING ================= --> + + <!-- Confirmation for associating an application with a companion device of SENSOR_DEVICE_STREAMING profile (type) [CHAR LIMIT=NONE] --> + <string name="title_sensor_device_streaming">Allow <strong><xliff:g id="app_name" example="Exo">%1$s</xliff:g></strong> to stream audio and system features between your <xliff:g id="device_type" example="phone">%2$s</xliff:g> and <strong><xliff:g id="device_name" example="Chromebook">%3$s</xliff:g></strong>?</string> + + <!-- Summary for associating an application with a companion device of SENSOR_DEVICE_STREAMING profile [CHAR LIMIT=NONE] --> + <string name="summary_sensor_device_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will have access to anything that’s played on your <xliff:g id="device_name" example="Chromebook">%3$s</xliff:g>.<br/><br/><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will be able to stream audio to <xliff:g id="device_name" example="Chromebook">%3$s</xliff:g> until you remove access to this permission.</string> + + <!-- Description of the helper dialog for SENSOR_DEVICE_STREAMING profile. [CHAR LIMIT=NONE] --> + <string name="helper_summary_sensor_device_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> is requesting permission on behalf of <xliff:g id="device_name" example="Chromebook">%2$s</xliff:g> to stream audio and system features between your devices.</string> + <!-- ================= null profile ================= --> <!-- A noun for a companion device with unspecified profile (type) [CHAR LIMIT=30] --> diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceResources.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceResources.java index 37b1f297f90b..fd771640ec09 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceResources.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceResources.java @@ -21,6 +21,7 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PRO import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER; import static android.companion.AssociationRequest.DEVICE_PROFILE_GLASSES; import static android.companion.AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; +import static android.companion.AssociationRequest.DEVICE_PROFILE_SENSOR_DEVICE_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH; import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE; @@ -116,6 +117,7 @@ final class CompanionDeviceResources { map.put(DEVICE_PROFILE_AUTOMOTIVE_PROJECTION, R.string.title_automotive_projection); map.put(DEVICE_PROFILE_COMPUTER, R.string.title_computer); map.put(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, R.string.title_nearby_device_streaming); + map.put(DEVICE_PROFILE_SENSOR_DEVICE_STREAMING, R.string.title_sensor_device_streaming); map.put(DEVICE_PROFILE_WATCH, R.string.confirmation_title); map.put(DEVICE_PROFILE_GLASSES, R.string.confirmation_title_glasses); map.put(null, R.string.confirmation_title); @@ -130,6 +132,7 @@ final class CompanionDeviceResources { map.put(DEVICE_PROFILE_GLASSES, R.string.summary_glasses); map.put(DEVICE_PROFILE_APP_STREAMING, R.string.summary_app_streaming); map.put(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, R.string.summary_nearby_device_streaming); + map.put(DEVICE_PROFILE_SENSOR_DEVICE_STREAMING, R.string.summary_sensor_device_streaming); map.put(null, R.string.summary_generic); PROFILE_SUMMARIES = unmodifiableMap(map); @@ -141,6 +144,8 @@ final class CompanionDeviceResources { map.put(DEVICE_PROFILE_APP_STREAMING, R.string.helper_summary_app_streaming); map.put(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, R.string.helper_summary_nearby_device_streaming); + map.put(DEVICE_PROFILE_SENSOR_DEVICE_STREAMING, + R.string.helper_summary_sensor_device_streaming); map.put(DEVICE_PROFILE_COMPUTER, R.string.helper_summary_computer); PROFILE_HELPER_SUMMARIES = unmodifiableMap(map); @@ -204,6 +209,7 @@ final class CompanionDeviceResources { set.add(DEVICE_PROFILE_COMPUTER); set.add(DEVICE_PROFILE_AUTOMOTIVE_PROJECTION); set.add(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING); + set.add(DEVICE_PROFILE_SENSOR_DEVICE_STREAMING); set.add(null); SUPPORTED_SELF_MANAGED_PROFILES = unmodifiableSet(set); diff --git a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml index 781373dfbd0b..327f42209cdb 100644 --- a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml +++ b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml @@ -19,6 +19,6 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" xmlns:tools="http://schemas.android.com/tools" tools:ignore="NewApi"> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainer" /> </shape> </inset>
\ No newline at end of file diff --git a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml index f28c354b898d..992fe3341f26 100644 --- a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml +++ b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml @@ -21,6 +21,6 @@ <shape android:shape="rectangle"> <corners android:topLeftRadius="4dp" android:topRightRadius="4dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainer" /> </shape> </inset>
\ No newline at end of file diff --git a/packages/CredentialManager/res/drawable/more_options_list_item.xml b/packages/CredentialManager/res/drawable/more_options_list_item.xml index 3f9d8157bfd2..991b3ff3c440 100644 --- a/packages/CredentialManager/res/drawable/more_options_list_item.xml +++ b/packages/CredentialManager/res/drawable/more_options_list_item.xml @@ -24,7 +24,7 @@ <shape> <corners android:topLeftRadius="0dp" android:topRightRadius="0dp" android:bottomLeftRadius="4dp" android:bottomRightRadius="4dp"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer"/> - <stroke android:color="?androidprv:attr/materialColorOutlineVariant" android:width="1dp"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainer"/> + <stroke android:color="@androidprv:color/materialColorOutlineVariant" android:width="1dp"/> </shape> </inset>
\ No newline at end of file diff --git a/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml b/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml index 914987ac4650..6f04bd99877e 100644 --- a/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml +++ b/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml @@ -35,7 +35,7 @@ android:layout_gravity="center" android:paddingStart="@dimen/autofill_view_left_padding" android:src="@drawable/more_horiz_24px" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:contentDescription="@string/more_options_content_description" android:background="@null"/> @@ -53,7 +53,7 @@ android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" style="@style/autofill.TextTitle"/> </LinearLayout> diff --git a/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml b/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml index 3fc61545a713..d00a2295e43a 100644 --- a/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml +++ b/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml @@ -35,7 +35,7 @@ android:layout_gravity="center" android:layout_alignParentStart="true" android:paddingStart="@dimen/autofill_view_left_padding" - app:tint="?androidprv:attr/materialColorOnSurface" + app:tint="@androidprv:color/materialColorOnSurface" android:background="@null"/> <LinearLayout @@ -53,7 +53,7 @@ android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textDirection="locale" style="@style/autofill.TextTitle"/> @@ -61,7 +61,7 @@ android:id="@android:id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:textDirection="locale" style="@style/autofill.TextSubtitle"/> diff --git a/packages/CredentialManager/res/values/colors.xml b/packages/CredentialManager/res/values/colors.xml index 9d31b350b4a0..8d37d47cc9fe 100644 --- a/packages/CredentialManager/res/values/colors.xml +++ b/packages/CredentialManager/res/values/colors.xml @@ -19,8 +19,8 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <!-- These colors are used for Remote Views. --> - <color name="onSurface">?androidprv:attr/materialColorOnSurface</color> - <color name="onSurfaceVariant">?androidprv:attr/materialColorOnSurfaceVariant</color> - <color name="surfaceDim">?androidprv:attr/materialColorSurfaceDim</color> - <color name="surfaceContainer">?androidprv:attr/materialColorSurfaceContainer</color> + <color name="onSurface">@androidprv:color/materialColorOnSurface</color> + <color name="onSurfaceVariant">@androidprv:color/materialColorOnSurfaceVariant</color> + <color name="surfaceDim">@androidprv:color/materialColorSurfaceDim</color> + <color name="surfaceContainer">@androidprv:color/materialColorSurfaceContainer</color> </resources>
\ No newline at end of file diff --git a/packages/CredentialManager/wear/res/values-ta/strings.xml b/packages/CredentialManager/wear/res/values-ta/strings.xml index 9f88c81b45c0..498d83bcbb07 100644 --- a/packages/CredentialManager/wear/res/values-ta/strings.xml +++ b/packages/CredentialManager/wear/res/values-ta/strings.xml @@ -19,7 +19,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7384524142163511792">"அனுமதிச் சான்று நிர்வாகி"</string> <string name="use_passkey_title" msgid="716598039340757817">"கடவுச்சாவியைப் பயன்படுத்தவா?"</string> - <string name="use_password_title" msgid="4655101984031246476">"கடவுச்சொல்லைப் பயன்படுத்தவா?"</string> + <string name="use_password_title" msgid="4655101984031246476">"கடவுச்சொல் பயன்படுத்தவா?"</string> <string name="dialog_dismiss_button" msgid="989567669882005067">"மூடு"</string> <string name="dialog_continue_button" msgid="8630290044077052145">"தொடர்க"</string> <string name="dialog_sign_in_options_button" msgid="448002958902615054">"உள்நுழைவு விருப்பங்கள்"</string> diff --git a/packages/CredentialManager/wear/res/values-te/strings.xml b/packages/CredentialManager/wear/res/values-te/strings.xml index 086b109b1933..ff85a89989a6 100644 --- a/packages/CredentialManager/wear/res/values-te/strings.xml +++ b/packages/CredentialManager/wear/res/values-te/strings.xml @@ -23,7 +23,7 @@ <string name="dialog_dismiss_button" msgid="989567669882005067">"విస్మరించండి"</string> <string name="dialog_continue_button" msgid="8630290044077052145">"కొనసాగించండి"</string> <string name="dialog_sign_in_options_button" msgid="448002958902615054">"సైన్ ఇన్ ఆప్షన్లు"</string> - <string name="sign_in_options_title" msgid="6720572645638986680">"సైన్ ఇన్ ఆప్షన్లు"</string> + <string name="sign_in_options_title" msgid="6720572645638986680">"సైన్-ఇన్ ఆప్షన్లు"</string> <string name="provider_list_title" msgid="6803918216129492212">"సైన్ ఇన్లను మేనేజ్ చేయండి"</string> <string name="choose_sign_in_title" msgid="3616025924746872202">"సైన్ ఇన్ను ఎంచుకోండి"</string> <string name="choose_passkey_title" msgid="8459270617632817465">"పాస్-కీని ఎంచుకోండి"</string> diff --git a/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java index 607ec1c71094..a078f7542c11 100644 --- a/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java +++ b/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java @@ -16,8 +16,6 @@ package com.android.server.ondeviceintelligence; -import static android.app.ondeviceintelligence.flags.Flags.enableOnDeviceIntelligenceModule; - import static android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ON_DEVICE_INTELLIGENCE_IDLE_TIMEOUT_MS; import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.DEVICE_CONFIG_UPDATE_BUNDLE_KEY; import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_LOADED_BROADCAST_INTENT; @@ -180,10 +178,8 @@ public class OnDeviceIntelligenceManagerService extends SystemService { publishBinderService( Context.ON_DEVICE_INTELLIGENCE_SERVICE, getOnDeviceIntelligenceManagerService(), /* allowIsolated = */ true); - if (enableOnDeviceIntelligenceModule()) { - LocalManagerRegistry.addManager(OnDeviceIntelligenceManagerLocal.class, + LocalManagerRegistry.addManager(OnDeviceIntelligenceManagerLocal.class, this::getRemoteInferenceServiceUid); - } } @Override @@ -198,20 +194,6 @@ public class OnDeviceIntelligenceManagerService extends SystemService { } } - @Override - public void onUserUnlocked(@NonNull TargetUser user) { - Slog.d(TAG, "onUserUnlocked: " + user.getUserHandle()); - //connect to remote services(if available) during boot. - if (user.getUserHandle().equals(UserHandle.SYSTEM)) { - try { - ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ false); - ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ false); - } catch (Exception e) { - Slog.w(TAG, "Couldn't pre-start remote ondeviceintelligence services.", e); - } - } - } - private void onDeviceConfigChange(@NonNull Set<String> keys) { if (keys.contains(KEY_SERVICE_ENABLED)) { mIsServiceEnabled = isServiceEnabled(); @@ -778,13 +760,8 @@ public class OnDeviceIntelligenceManagerService extends SystemService { if (mTemporaryConfigNamespace != null) { return mTemporaryConfigNamespace; } - return mContext.getResources() - .getString( - mContext.getResources() - .getIdentifier( - "config_defaultOnDeviceIntelligenceDeviceConfigNamespace", - "string", - "android")); + return mContext.getResources().getString( + android.R.string.config_defaultOnDeviceIntelligenceDeviceConfigNamespace); } } @@ -966,22 +943,10 @@ public class OnDeviceIntelligenceManagerService extends SystemService { return mTemporaryServiceNames; } } - return new String[]{ - mContext.getResources() - .getString( - mContext.getResources() - .getIdentifier( - "config_defaultOnDeviceIntelligenceService", - "string", - "android")), - mContext.getResources() - .getString( - mContext.getResources() - .getIdentifier( - "config_defaultOnDeviceSandboxedInferenceService", - "string", - "android")) - }; + return new String[]{mContext.getResources().getString( + android.R.string.config_defaultOnDeviceIntelligenceService), + mContext.getResources().getString( + android.R.string.config_defaultOnDeviceSandboxedInferenceService)}; } protected String[] getBroadcastKeys() throws Resources.NotFoundException { diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml index 77fad551eba7..ac96d7adf48d 100644 --- a/packages/PackageInstaller/res/values-af/strings.xml +++ b/packages/PackageInstaller/res/values-af/strings.xml @@ -24,8 +24,8 @@ <string name="installing" msgid="4921993079741206516">"Installeer tans …"</string> <string name="installing_app" msgid="1165095864863849422">"Installeer tans <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> <string name="install_done" msgid="5987363587661783896">"App geïnstalleer."</string> - <string name="install_confirm_question" msgid="7663733664476363311">"Wil jy hierdie program installeer?"</string> - <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil jy hierdie program opdateer?"</string> + <string name="install_confirm_question" msgid="7663733664476363311">"Wil jy hierdie app installeer?"</string> + <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil jy hierdie app opdateer?"</string> <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="7994800761970572198">"<p>Dateer hierdie app op vanaf <b><xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g></b>?</p><p>Hierdie app ontvang gewoonlik opdaterings vanaf <b><xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g></b>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou tablet kry. Appfunksies kan verander.</p>"</string> <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="2435174886412089791">"<p>Dateer hierdie app op vanaf <b><xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g></b>?</p><p>Hierdie app ontvang gewoonlik opdaterings vanaf <b><xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g></b>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou TV kry. Appfunksies kan verander.</p>"</string> <string name="install_confirm_question_update_owner_reminder" product="default" msgid="7155138616126795839">"<p>Dateer hierdie app op vanaf <b><xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g></b>?</p><p>Hierdie app ontvang gewoonlik opdaterings vanaf <b><xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g></b>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou foon kry. Appfunksies kan verander.</p>"</string> @@ -66,9 +66,9 @@ <string name="archive_application_text_current_user_private_profile" msgid="1958423158655599132">"Wil jy hierdie app wat in jou privaat ruimte is, argiveer? Jou persoonlike data sal gestoor word"</string> <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Wil jy hierdie app vir "<b>"alle"</b>" gebruikers deïnstalleer? Die app en sy data sal van "<b>"alle"</b>" gebruikers op hierdie toestel verwyder word."</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"Wil jy hierdie app vir die gebruiker <xliff:g id="USERNAME">%1$s</xliff:g> deïnstalleer?"</string> - <string name="uninstall_application_text_current_user_work_profile" msgid="8788387739022366193">"Wil jy hierdie program op jou werkprofiel deïnstalleer?"</string> + <string name="uninstall_application_text_current_user_work_profile" msgid="8788387739022366193">"Wil jy hierdie app op jou werkprofiel deïnstalleer?"</string> <string name="uninstall_update_text" msgid="863648314632448705">"Vervang hierdie app met die fabriekweergawe? Alle data sal verwyder word."</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Vervang hierdie program met die fabriekweergawe? Alle data sal verwyder word. Dit beïnvloed alle gebruikers van hierdie toestel, insluitend dié met werkprofiele."</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Vervang hierdie app met die fabriekweergawe? Alle data sal verwyder word. Dit beïnvloed alle gebruikers van hierdie toestel, insluitend dié met werkprofiele."</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"Hou <xliff:g id="SIZE">%1$s</xliff:g> se programdata."</string> <string name="uninstall_application_text_current_user_clone_profile" msgid="835170400160011636">"Wil jy hierdie app uitvee?"</string> <string name="uninstall_application_text_with_clone_instance" msgid="6944473334273349036">"Wil jy hierdie app deïnstalleer? <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-kloon sal ook uitgevee word."</string> diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java index 379dfe32cc51..635ae20cfa38 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java @@ -36,6 +36,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Process; import android.os.UserManager; +import android.provider.Settings; import android.text.TextUtils; import android.util.EventLog; import android.util.Log; @@ -62,9 +63,12 @@ public class InstallStart extends Activity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + boolean testOverrideForPiaV2 = Settings.System.getInt(getContentResolver(), + "use_pia_v2", 0) == 1; + boolean usePiaV2aConfig = usePiaV2(); - if (usePiaV2()) { - Log.i(TAG, "Using Pia V2"); + if (usePiaV2aConfig || testOverrideForPiaV2) { + logReasonForDebug(usePiaV2aConfig, testOverrideForPiaV2); Intent piaV2 = new Intent(getIntent()); piaV2.putExtra(InstallLaunch.EXTRA_CALLING_PKG_NAME, getLaunchedFromPackage()); @@ -381,4 +385,20 @@ public class InstallStart extends Activity { } return null; } + + private void logReasonForDebug(boolean usePiaV2aConfig, boolean testOverrideForPiaV2) { + StringBuilder sb = new StringBuilder("Using Pia V2 due to: "); + boolean aconfigUsed = false; + if (usePiaV2aConfig) { + sb.append("aconfig flag USE_PIA_V2"); + aconfigUsed = true; + } + if (testOverrideForPiaV2) { + if (aconfigUsed) { + sb.append(" and "); + } + sb.append("testOverrideForPiaV2."); + } + Log.i(TAG, sb.toString()); + } } diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml index 8d6f0da4262f..fdc59754df95 100644 --- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml +++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml @@ -20,7 +20,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:targetApi="28" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> <corners android:topLeftRadius="?android:attr/dialogCornerRadius" android:topRightRadius="0dp" diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml index 307277264ff6..405c45272792 100644 --- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml +++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml @@ -20,7 +20,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:targetApi="28" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> <corners android:topLeftRadius="0dp" android:topRightRadius="?android:attr/dialogCornerRadius" diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml index f1790f9ba351..187e612d11c4 100644 --- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml +++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml @@ -20,7 +20,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:targetApi="28" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> <corners android:radius="?android:attr/dialogCornerRadius" /> diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml index d56c8434824f..0182b4c650a1 100644 --- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml +++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml @@ -18,7 +18,7 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> <corners android:radius="0dp" /> diff --git a/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml index cc948a670382..fd8cecb8536e 100644 --- a/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml +++ b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml @@ -22,12 +22,13 @@ <item name="iconGravity">textTop</item> </style> - <style name="SettingsLibActionButton.Expressive.Label" parent="SettingsLibTextAppearance.Emphasized.Title.Small"> + <style name="SettingsLibActionButton.Expressive.Label" parent=""> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:minWidth">@dimen/settingslib_expressive_space_small3</item> <item name="android:minHeight">@dimen/settingslib_expressive_space_small3</item> - <item name="android:textColor">@color/settingslib_materialColorOnSurface</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleSmall.Emphasized</item> + <item name="android:textColor">@color/settingslib_text_color_primary</item> <item name="android:layout_gravity">center</item> </style> diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index a3da93da31ae..d739aafea929 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -65,6 +65,7 @@ android_library { libs:[ // This flag library has been added in frameworks jar "aconfig_settingslib_flags_java_lib", + "wifi_framework_aconfig_flags_lib", ], plugins: ["androidx.room_room-compiler-plugin"], use_resource_processor: true, diff --git a/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml b/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml index 716ed412eb5c..9018baca79e7 100644 --- a/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml +++ b/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml @@ -40,7 +40,6 @@ <ImageView android:id="@android:id/icon" - android:src="@drawable/settingslib_arrow_drop_down" android:layout_width="@dimen/settingslib_expressive_space_medium3" android:layout_height="@dimen/settingslib_expressive_space_medium3" android:scaleType="centerInside"/> @@ -60,16 +59,12 @@ android:id="@android:id/title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hyphenationFrequency="normalFast" - android:lineBreakWordStyle="phrase" android:textAppearance="@style/TextAppearance.CardTitle.SettingsLib"/> <TextView android:id="@android:id/summary" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hyphenationFrequency="normalFast" - android:lineBreakWordStyle="phrase" android:textAppearance="@style/TextAppearance.CardSummary.SettingsLib"/> </LinearLayout> diff --git a/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml b/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml index 4cbdea52d439..287b13fa0d50 100644 --- a/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml +++ b/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml @@ -17,14 +17,12 @@ <resources> <style name="TextAppearance.CardTitle.SettingsLib" - parent="@style/TextAppearance.PreferenceTitle.SettingsLib"> + parent="@style/TextAppearance.SettingsLib.TitleMedium.Emphasized"> <item name="android:textColor">@color/settingslib_materialColorOnPrimary</item> - <item name="android:textSize">20sp</item> </style> <style name="TextAppearance.CardSummary.SettingsLib" - parent="@style/TextAppearance.PreferenceSummary.SettingsLib"> + parent="@style/TextAppearance.SettingsLib.LabelMedium"> <item name="android:textColor">@color/settingslib_materialColorOnSecondary</item> - <item name="android:textSize">14sp</item> </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml index ccbe20e1c61f..9986a60250fe 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml @@ -17,12 +17,9 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item - android:start="16dp" - android:end="16dp" - android:top="4dp" - android:bottom="4dp"> + android:start="16dp"> <shape> - <size android:width="32dp" android:height="40dp" /> + <size android:width="40dp" android:height="40dp" /> <solid android:color="@color/settingslib_materialColorSurfaceContainerHighest" /> <corners android:radius="100dp" /> @@ -30,23 +27,21 @@ </item> <item - android:width="24dp" - android:height="24dp" + android:width="16dp" + android:height="16dp" android:gravity="center" android:start="16dp" - android:end="16dp" - android:top="4dp" - android:bottom="4dp"> +> <vector - android:width="24dp" - android:height="24dp" - android:viewportWidth="960" - android:viewportHeight="960" + android:width="16dp" + android:height="16dp" + android:viewportWidth="16" + android:viewportHeight="16" android:tint="@color/settingslib_materialColorOnSurfaceVariant" android:autoMirrored="true"> <path android:fillColor="@android:color/white" - android:pathData="M313,520L537,744L480,800L160,480L480,160L537,216L313,440L800,440L800,520L313,520Z"/> + android:pathData="M3.626,9L8.526,13.9C8.726,14.1 8.817,14.333 8.801,14.6C8.801,14.867 8.701,15.1 8.501,15.3C8.301,15.483 8.067,15.583 7.801,15.6C7.534,15.6 7.301,15.5 7.101,15.3L0.501,8.7C0.401,8.6 0.326,8.492 0.276,8.375C0.242,8.258 0.226,8.133 0.226,8C0.226,7.867 0.242,7.742 0.276,7.625C0.326,7.508 0.401,7.4 0.501,7.3L7.101,0.7C7.284,0.517 7.509,0.425 7.776,0.425C8.059,0.425 8.301,0.517 8.501,0.7C8.701,0.9 8.801,1.142 8.801,1.425C8.801,1.692 8.701,1.925 8.501,2.125L3.626,7H14.801C15.084,7 15.317,7.1 15.501,7.3C15.701,7.483 15.801,7.717 15.801,8C15.801,8.283 15.701,8.525 15.501,8.725C15.317,8.908 15.084,9 14.801,9H3.626Z"/> </vector> </item> </layer-list>
\ No newline at end of file diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml index e68253e2200d..fadcf7ba8699 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml @@ -18,7 +18,7 @@ <style name="Theme.CollapsingToolbar.Settings" parent="@style/Theme.MaterialComponents.DayNight"> <item name="elevationOverlayEnabled">true</item> <item name="elevationOverlayColor">?attr/colorPrimary</item> - <item name="colorPrimary">@color/settingslib_materialColorInverseOnSurface</item> + <item name="colorPrimary">@color/settingslib_materialColorOnSurfaceInverse</item> <item name="colorAccent">@color/settingslib_materialColorPrimaryFixed</item> </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml index d58c2c2eeb23..37a78101cc4e 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml @@ -33,12 +33,12 @@ <item name="contentScrim">@color/settingslib_materialColorSurfaceContainer</item> </style> - <style name="SettingsLibCollapsingToolbarTitle.Collapsed" parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <style name="SettingsLibCollapsingToolbarTitle.Collapsed" parent="@style/TextAppearance.SettingsLib.TitleLarge.Emphasized"> <!--set dp because we don't want size adjust when font size change--> - <item name="android:textSize">20dp</item> + <item name="android:textSize">22dp</item> </style> - <style name="SettingsLibCollapsingToolbarTitle.Expanded" parent="CollapsingToolbarTitle.Collapsed"> + <style name="SettingsLibCollapsingToolbarTitle.Expanded" parent="@style/TextAppearance.SettingsLib.DisplaySmall.Emphasized"> <item name="android:textSize">36dp</item> </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml index f7c9aac68629..7c9d1a47b7ef 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml @@ -18,7 +18,7 @@ <style name="Theme.CollapsingToolbar.Settings" parent="@style/Theme.MaterialComponents.DayNight"> <item name="elevationOverlayEnabled">true</item> <item name="elevationOverlayColor">?attr/colorPrimary</item> - <item name="colorPrimary">@color/settingslib_materialColorInverseOnSurface</item> + <item name="colorPrimary">@color/settingslib_materialColorOnSurfaceInverse</item> <item name="colorAccent">@color/settingslib_materialColorPrimary</item> </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyValueStore.kt b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyValueStore.kt index 5f1f8df02bbc..472ffa9289a7 100644 --- a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyValueStore.kt +++ b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyValueStore.kt @@ -47,6 +47,37 @@ interface KeyValueStore : KeyedObservable<String> { * @param value value to set, null means remove */ fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) + + /** Gets the boolean value of given key. */ + fun getBoolean(key: String): Boolean? = getValue(key, Boolean::class.javaObjectType) + + /** Sets boolean value for given key, null value means delete the key from data store. */ + fun setBoolean(key: String, value: Boolean?) = + setValue(key, Boolean::class.javaObjectType, value) + + /** Gets the float value of given key. */ + fun getFloat(key: String): Float? = getValue(key, Float::class.javaObjectType) + + /** Sets float value for given key, null value means delete the key from data store. */ + fun setFloat(key: String, value: Float?) = setValue(key, Float::class.javaObjectType, value) + + /** Gets the int value of given key. */ + fun getInt(key: String): Int? = getValue(key, Int::class.javaObjectType) + + /** Sets int value for given key, null value means delete the key from data store. */ + fun setInt(key: String, value: Int?) = setValue(key, Int::class.javaObjectType, value) + + /** Gets the long value of given key. */ + fun getLong(key: String): Long? = getValue(key, Long::class.javaObjectType) + + /** Sets long value for given key, null value means delete the key from data store. */ + fun setLong(key: String, value: Long?) = setValue(key, Long::class.javaObjectType, value) + + /** Gets the string value of given key. */ + fun getString(key: String): String? = getValue(key, String::class.javaObjectType) + + /** Sets string value for given key, null value means delete the key from data store. */ + fun setString(key: String, value: String?) = setValue(key, String::class.javaObjectType, value) } /** [SharedPreferences] based [KeyValueStore]. */ diff --git a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt index d6e7a896eb63..3f1a499807dd 100644 --- a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt +++ b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt @@ -50,37 +50,6 @@ abstract class SettingsStore(protected val contentResolver: ContentResolver) : contentResolver.unregisterContentObserver(contentObserver) } - /** Gets the boolean value of given key. */ - fun getBoolean(key: String): Boolean? = getValue(key, Boolean::class.javaObjectType) - - /** Sets boolean value for given key, null value means delete the key from data store. */ - fun setBoolean(key: String, value: Boolean?) = - setValue(key, Boolean::class.javaObjectType, value) - - /** Gets the float value of given key. */ - fun getFloat(key: String): Float? = getValue(key, Float::class.javaObjectType) - - /** Sets float value for given key, null value means delete the key from data store. */ - fun setFloat(key: String, value: Float?) = setValue(key, Float::class.javaObjectType, value) - - /** Gets the int value of given key. */ - fun getInt(key: String): Int? = getValue(key, Int::class.javaObjectType) - - /** Sets int value for given key, null value means delete the key from data store. */ - fun setInt(key: String, value: Int?) = setValue(key, Int::class.javaObjectType, value) - - /** Gets the long value of given key. */ - fun getLong(key: String): Long? = getValue(key, Long::class.javaObjectType) - - /** Sets long value for given key, null value means delete the key from data store. */ - fun setLong(key: String, value: Long?) = setValue(key, Long::class.javaObjectType, value) - - /** Gets the string value of given key. */ - fun getString(key: String): String? = getValue(key, String::class.javaObjectType) - - /** Sets string value for given key, null value means delete the key from data store. */ - fun setString(key: String, value: String?) = setValue(key, String::class.javaObjectType, value) - /** Tag for logging. */ abstract val tag: String } diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt index a768b5edb395..606710e6f356 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt @@ -55,9 +55,9 @@ import com.android.settingslib.metadata.RangeValue import com.android.settingslib.metadata.ReadWritePermit import com.android.settingslib.preference.PreferenceScreenFactory import com.android.settingslib.preference.PreferenceScreenProvider +import java.util.Locale import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import java.util.Locale private const val TAG = "PreferenceGraphBuilder" @@ -399,15 +399,11 @@ fun PreferenceMetadata.toProto( value = preferenceValueProto { when (metadata) { is BooleanValue -> - metadata - .storage(context) - .getValue(metadata.key, Boolean::class.javaObjectType) - ?.let { booleanValue = it } + metadata.storage(context).getBoolean(metadata.key)?.let { + booleanValue = it + } is RangeValue -> { - metadata - .storage(context) - .getValue(metadata.key, Int::class.javaObjectType) - ?.let { intValue = it } + metadata.storage(context).getInt(metadata.key)?.let { intValue = it } } else -> {} } diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt index 7cfce0d85cd4..56b169370e47 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt @@ -146,7 +146,7 @@ class PreferenceSetterApiHandler( val booleanValue = value.booleanValue val resultCode = metadata.checkWritePermit(booleanValue) if (resultCode != PreferenceSetterResult.OK) return resultCode - storage.setValue(key, Boolean::class.javaObjectType, booleanValue) + storage.setBoolean(key, booleanValue) return PreferenceSetterResult.OK } else if (value.hasIntValue()) { val intValue = value.intValue @@ -155,7 +155,7 @@ class PreferenceSetterApiHandler( if (metadata is RangeValue && !metadata.isValidValue(application, intValue)) { return PreferenceSetterResult.INVALID_REQUEST } - storage.setValue(key, Int::class.javaObjectType, intValue) + storage.setInt(key, intValue) return PreferenceSetterResult.OK } } catch (e: Exception) { diff --git a/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml index 2edc001ccc3f..43cf6aa09109 100644 --- a/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml +++ b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml @@ -26,7 +26,6 @@ <ImageView android:id="@android:id/icon" - android:src="@drawable/settingslib_arrow_drop_down" style="@style/SettingsLibEntityHeaderIcon"/> <TextView diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java index 106802e9d1d1..73728bcd1ff7 100644 --- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java +++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java @@ -32,6 +32,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.ColorInt; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.android.settingslib.widget.mainswitch.R; @@ -42,7 +43,7 @@ import java.util.List; /** * MainSwitchBar is a View with a customized Switch. * This component is used as the main switch of the page - * to enable or disable the prefereces on the page. + * to enable or disable the preferences on the page. */ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListener { @@ -58,6 +59,8 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen protected CompoundButton mSwitch; private final View mFrameView; + private @Nullable PreChangeListener mPreChangeListener; + public MainSwitchBar(Context context) { this(context, null); } @@ -138,10 +141,20 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen @Override public boolean performClick() { - mSwitch.performClick(); + if (callPreChangeListener()) { + mSwitch.performClick(); + } return super.performClick(); } + protected boolean callPreChangeListener() { + return mPreChangeListener == null || mPreChangeListener.preChange(!mSwitch.isChecked()); + } + + public void setPreChangeListener(@Nullable PreChangeListener preChangeListener) { + mPreChangeListener = preChangeListener; + } + /** * Update the switch status */ @@ -271,7 +284,7 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen } } - static class SavedState extends BaseSavedState { + public static class SavedState extends BaseSavedState { boolean mChecked; boolean mVisible; @@ -341,4 +354,16 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen requestLayout(); } + + /** + * Listener callback before switch is toggled. + */ + public interface PreChangeListener { + /** + * Returns if the new value can be set. + * + * When false is return, the switch toggle is not triggered at all. + */ + boolean preChange(boolean isCheck); + } } diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt index 6e86fa7312cf..c1edbdc20361 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt @@ -107,20 +107,11 @@ interface PreferenceMetadata { * * UI framework normally does not allow user to interact with the preference widget when it is * disabled. - * - * [dependencyOfEnabledState] is provided to support dependency, the [shouldDisableDependents] - * value of dependent preference is used to decide enabled state. */ - fun isEnabled(context: Context): Boolean { - val dependency = dependencyOfEnabledState(context) ?: return true - return !dependency.shouldDisableDependents(context) - } - - /** Returns the key of depended preference to decide the enabled state. */ - fun dependencyOfEnabledState(context: Context): PreferenceMetadata? = null + fun isEnabled(context: Context): Boolean = true - /** Returns whether this preference's dependents should be disabled. */ - fun shouldDisableDependents(context: Context): Boolean = !isEnabled(context) + /** Returns the keys of depended preferences. */ + fun dependencies(context: Context): Array<String> = arrayOf() /** Returns if the preference is persistent in datastore. */ fun isPersistent(context: Context): Boolean = this is PersistentPreference<*> @@ -174,13 +165,11 @@ interface PreferenceMetadata { } /** Metadata of preference group. */ -@AnyThread -interface PreferenceGroup : PreferenceMetadata +@AnyThread interface PreferenceGroup : PreferenceMetadata /** Metadata of preference category. */ @AnyThread -open class PreferenceCategory(override val key: String, override val title: Int) : - PreferenceGroup +open class PreferenceCategory(override val key: String, override val title: Int) : PreferenceGroup /** Metadata of preference screen. */ @AnyThread diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt index 6704ecc93891..3dd15946d415 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt @@ -21,6 +21,7 @@ import android.content.ContextWrapper import android.content.Intent import android.os.Bundle import androidx.lifecycle.LifecycleCoroutineScope +import com.android.settingslib.datastore.KeyValueStore import kotlinx.coroutines.CoroutineScope /** @@ -157,6 +158,9 @@ abstract class PreferenceLifecycleContext(context: Context) : ContextWrapper(con */ abstract fun <T : Any> requirePreference(key: String): T + /** Returns the [KeyValueStore] attached to the preference of given key *on the same screen*. */ + abstract fun getKeyValueStore(key: String): KeyValueStore? + /** Notifies that preference state of given key is changed and updates preference widget UI. */ abstract fun notifyPreferenceChange(key: String) diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt index b64f5dc49b4b..87bd261bf4bd 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt @@ -16,19 +16,10 @@ package com.android.settingslib.metadata -import android.content.Context import androidx.annotation.StringRes -/** - * Common base class for preferences that have two selectable states, save a boolean value, and may - * have dependent preferences that are enabled/disabled based on the current state. - */ -interface TwoStatePreference : PreferenceMetadata, PersistentPreference<Boolean>, BooleanValue { - - override fun shouldDisableDependents(context: Context) = - storage(context).getValue(key, Boolean::class.javaObjectType) != true || - super.shouldDisableDependents(context) -} +/** Common base class for preferences that have two selectable states and save a boolean value. */ +interface TwoStatePreference : PreferenceMetadata, PersistentPreference<Boolean>, BooleanValue /** A preference that provides a two-state toggleable option. */ open class SwitchPreference @@ -42,7 +33,4 @@ constructor( /** A preference that provides a two-state toggleable option that can be used as a main switch. */ open class MainSwitchPreference @JvmOverloads -constructor( - override val key: String, - @StringRes override val title: Int = 0, -) : TwoStatePreference
\ No newline at end of file +constructor(override val key: String, @StringRes override val title: Int = 0) : TwoStatePreference diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceDataStoreAdapter.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceDataStoreAdapter.kt index 7601b9a31041..f0f854aac79b 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceDataStoreAdapter.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceDataStoreAdapter.kt @@ -23,38 +23,31 @@ import com.android.settingslib.datastore.KeyValueStore class PreferenceDataStoreAdapter(val keyValueStore: KeyValueStore) : PreferenceDataStore() { override fun getBoolean(key: String, defValue: Boolean): Boolean = - keyValueStore.getValue(key, Boolean::class.javaObjectType) ?: defValue + keyValueStore.getBoolean(key) ?: defValue override fun getFloat(key: String, defValue: Float): Float = - keyValueStore.getValue(key, Float::class.javaObjectType) ?: defValue + keyValueStore.getFloat(key) ?: defValue - override fun getInt(key: String, defValue: Int): Int = - keyValueStore.getValue(key, Int::class.javaObjectType) ?: defValue + override fun getInt(key: String, defValue: Int): Int = keyValueStore.getInt(key) ?: defValue - override fun getLong(key: String, defValue: Long): Long = - keyValueStore.getValue(key, Long::class.javaObjectType) ?: defValue + override fun getLong(key: String, defValue: Long): Long = keyValueStore.getLong(key) ?: defValue override fun getString(key: String, defValue: String?): String? = - keyValueStore.getValue(key, String::class.javaObjectType) ?: defValue + keyValueStore.getString(key) ?: defValue @Suppress("UNCHECKED_CAST") override fun getStringSet(key: String, defValues: Set<String>?): Set<String>? = (keyValueStore.getValue(key, Set::class.javaObjectType) as Set<String>?) ?: defValues - override fun putBoolean(key: String, value: Boolean) = - keyValueStore.setValue(key, Boolean::class.javaObjectType, value) + override fun putBoolean(key: String, value: Boolean) = keyValueStore.setBoolean(key, value) - override fun putFloat(key: String, value: Float) = - keyValueStore.setValue(key, Float::class.javaObjectType, value) + override fun putFloat(key: String, value: Float) = keyValueStore.setFloat(key, value) - override fun putInt(key: String, value: Int) = - keyValueStore.setValue(key, Int::class.javaObjectType, value) + override fun putInt(key: String, value: Int) = keyValueStore.setInt(key, value) - override fun putLong(key: String, value: Long) = - keyValueStore.setValue(key, Long::class.javaObjectType, value) + override fun putLong(key: String, value: Long) = keyValueStore.setLong(key, value) - override fun putString(key: String, value: String?) = - keyValueStore.setValue(key, String::class.javaObjectType, value) + override fun putString(key: String, value: String?) = keyValueStore.setString(key, value) override fun putStringSet(key: String, values: Set<String>?) = keyValueStore.setValue(key, Set::class.javaObjectType, values) diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt index 6fc9357e9332..a9e20f284a61 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt @@ -67,6 +67,11 @@ class PreferenceScreenBindingHelper( override fun <T : Any> requirePreference(key: String) = findPreference<T>(key)!! + override fun getKeyValueStore(key: String) = + (findPreference<Preference>(key)?.preferenceDataStore + as? PreferenceDataStoreAdapter) + ?.keyValueStore + override fun notifyPreferenceChange(key: String) = notifyChange(key, CHANGE_REASON_STATE) @@ -92,14 +97,14 @@ class PreferenceScreenBindingHelper( val preferencesBuilder = ImmutableMap.builder<String, PreferenceHierarchyNode>() val dependenciesBuilder = ImmutableMultimap.builder<String, String>() val lifecycleAwarePreferences = mutableListOf<PreferenceLifecycleProvider>() - fun PreferenceMetadata.addDependency(dependency: PreferenceMetadata) { - dependenciesBuilder.put(key, dependency.key) - } fun PreferenceHierarchyNode.addNode() { metadata.let { - preferencesBuilder.put(it.key, this) - it.dependencyOfEnabledState(context)?.addDependency(it) + val key = it.key + preferencesBuilder.put(key, this) + for (dependency in it.dependencies(context)) { + dependenciesBuilder.put(dependency, key) + } if (it is PreferenceLifecycleProvider) lifecycleAwarePreferences.add(it) } } diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant12.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant12.xml new file mode 100644 index 000000000000..f125425d1ec9 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant12.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="12"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant17.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant17.xml new file mode 100644 index 000000000000..36a781954e42 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant17.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="17"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant22.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant22.xml new file mode 100644 index 000000000000..0ef31d014aa2 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant22.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="22"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant24.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant24.xml new file mode 100644 index 000000000000..6797f82e4250 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant24.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="24"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant4.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant4.xml new file mode 100644 index 000000000000..ff7df5543a40 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant4.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="4"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant6.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant6.xml new file mode 100644 index 000000000000..8da5dafea567 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant6.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="6"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant87.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant87.xml new file mode 100644 index 000000000000..227baeedd99e --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant87.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="87"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant92.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant92.xml new file mode 100644 index 000000000000..f4564381eb33 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant92.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="92"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant94.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant94.xml new file mode 100644 index 000000000000..bb4e03d64307 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant94.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="94"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant96.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant96.xml new file mode 100644 index 000000000000..949b1961099f --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant96.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="96"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant98.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant98.xml new file mode 100644 index 000000000000..7e5ee241ffbd --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant98.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_600" android:lStar="98"/> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_check.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_check.xml index 309dbdf1ea96..309dbdf1ea96 100644 --- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_check.xml +++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_check.xml diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_close.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_close.xml index e6df8a416922..e6df8a416922 100644 --- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_close.xml +++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_close.xml diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_switch_thumb_icon.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_switch_thumb_icon.xml index 342729d7ee5a..342729d7ee5a 100644 --- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_switch_thumb_icon.xml +++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_switch_thumb_icon.xml diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml index ea7baa42a2c7..2261e58a961e 100644 --- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml +++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml @@ -40,7 +40,7 @@ android:longClickable="false" android:maxLines="10" android:ellipsize="end" - android:textAppearance="@style/TextAppearance.TopIntroText"/> + android:textAppearance="@style/TextAppearance.SettingsLib.BodyLarge"/> <com.android.settingslib.widget.LinkableTextView android:id="@+id/settingslib_expressive_learn_more" diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_expressive_preference_text_frame.xml index c837ff43e46b..db357f8ae13f 100644 --- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml +++ b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_expressive_preference_text_frame.xml @@ -32,8 +32,6 @@ android:layout_gravity="start" android:textAlignment="viewStart" android:maxLines="2" - android:hyphenationFrequency="normalFast" - android:lineBreakWordStyle="phrase" android:textAppearance="?android:attr/textAppearanceListItem" android:ellipsize="marquee"/> @@ -47,7 +45,5 @@ android:textAlignment="viewStart" android:textAppearance="?android:attr/textAppearanceListItemSecondary" android:textColor="?android:attr/textColorSecondary" - android:maxLines="10" - android:hyphenationFrequency="normalFast" - android:lineBreakWordStyle="phrase"/> + android:maxLines="10"/> </RelativeLayout>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_preference_category_no_title.xml index f69fcd270919..f69fcd270919 100644 --- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml +++ b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_preference_category_no_title.xml diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml index 46ec62e7a5ef..8873116be306 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml @@ -58,4 +58,39 @@ <color name="settingslib_colorSurface">@color/settingslib_surface_dark</color> <color name="settingslib_list_divider_color">@android:color/system_neutral1_700</color> + + <color name="settingslib_materialColorPrimary">@android:color/system_accent1_200</color> + <color name="settingslib_materialColorOnPrimary">@android:color/system_accent1_800</color> + <color name="settingslib_materialColorPrimaryContainer">@android:color/system_accent1_700</color> + <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_accent1_100</color> + <color name="settingslib_materialColorPrimaryInverse">@android:color/system_accent1_600</color> + <color name="settingslib_materialColorSecondary">@android:color/system_accent2_200</color> + <color name="settingslib_materialColorOnSecondary">@android:color/system_accent2_800</color> + <color name="settingslib_materialColorSecondaryContainer">@android:color/system_accent2_700</color> + <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_accent2_100</color> + <color name="settingslib_materialColorTertiary">@android:color/system_accent3_200</color> + <color name="settingslib_materialColorOnTertiary">@android:color/system_accent3_800</color> + <color name="settingslib_materialColorTertiaryContainer">@android:color/system_accent3_700</color> + <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_accent3_100</color> + <color name="settingslib_materialColorError">@color/settingslib_error_200</color> + <color name="settingslib_materialColorOnError">@color/settingslib_error_800</color> + <color name="settingslib_materialColorErrorContainer">@color/settingslib_error_700</color> + <color name="settingslib_materialColorOnErrorContainer">@color/settingslib_error_100</color> + <color name="settingslib_materialColorOutline">@android:color/system_neutral2_400</color> + <color name="settingslib_materialColorOutlineVariant">@android:color/system_neutral2_700</color> + <color name="settingslib_materialColorBackground">@color/settingslib_neutral_variant6</color> + <color name="settingslib_materialColorOnBackground">@android:color/system_neutral1_100</color> + <color name="settingslib_materialColorSurface">@color/settingslib_neutral_variant6</color> + <color name="settingslib_materialColorOnSurface">@android:color/system_neutral1_100</color> + <color name="settingslib_materialColorSurfaceVariant">@android:color/system_neutral2_700</color> + <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_neutral2_200</color> + <color name="settingslib_materialColorSurfaceInverse">@android:color/system_neutral1_100</color> + <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_neutral1_800</color> + <color name="settingslib_materialColorSurfaceBright">@color/settingslib_neutral_variant24</color> + <color name="settingslib_materialColorSurfaceDim">@color/settingslib_neutral_variant6</color> + <color name="settingslib_materialColorSurfaceContainer">@color/settingslib_neutral_variant12</color> + <color name="settingslib_materialColorSurfaceContainerLowest">@color/settingslib_neutral_variant4</color> + <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_neutral2_900</color> + <color name="settingslib_materialColorSurfaceContainerHigh">@color/settingslib_neutral_variant17</color> + <color name="settingslib_materialColorSurfaceContainerHighest">@color/settingslib_neutral_variant22</color> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml index 8cfe54f44fe5..00a1f27c162a 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml @@ -42,4 +42,39 @@ <color name="settingslib_text_color_primary_device_default">@android:color/system_on_surface_dark</color> <!--Deprecated. After sdk 35 don't use it. using materialColorOnSurfaceVariant--> <color name="settingslib_text_color_secondary_device_default">@android:color/system_on_surface_variant_dark</color> + + <color name="settingslib_materialColorPrimary">@android:color/system_primary_dark</color> + <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_dark</color> + <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_dark</color> + <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_dark</color> + <color name="settingslib_materialColorPrimaryInverse">@android:color/system_primary_light</color> + <color name="settingslib_materialColorSecondary">@android:color/system_secondary_dark</color> + <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_dark</color> + <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_dark</color> + <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_dark</color> + <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_dark</color> + <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_dark</color> + <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_dark</color> + <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_dark</color> + <color name="settingslib_materialColorError">@android:color/system_error_dark</color> + <color name="settingslib_materialColorOnError">@android:color/system_on_error_dark</color> + <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_dark</color> + <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_dark</color> + <color name="settingslib_materialColorOutline">@android:color/system_outline_dark</color> + <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_dark</color> + <color name="settingslib_materialColorBackground">@android:color/system_background_dark</color> + <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_dark</color> + <color name="settingslib_materialColorSurface">@android:color/system_surface_dark</color> + <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_dark</color> + <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_dark</color> + <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_dark</color> + <color name="settingslib_materialColorSurfaceInverse">@android:color/system_surface_light</color> + <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_on_surface_light</color> + <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_dark</color> + <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_dark</color> + <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_dark</color> + <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_dark</color> + <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_dark</color> + <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_dark</color> + <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_dark</color> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml index 84a3ed68af01..e31e80176625 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml @@ -46,37 +46,4 @@ <color name="settingslib_colorSurfaceHeader">@color/settingslib_materialColorSurfaceVariant</color> <color name="settingslib_text_color_preference_category_title">@color/settingslib_materialColorPrimary</color> - - <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_dark</color> - <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_dark</color> - <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_dark</color> - <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_dark</color> - <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_dark</color> - <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_dark</color> - <color name="settingslib_materialColorInverseOnSurface">@android:color/system_on_surface_light</color> - <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_dark</color> - <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_dark</color> - <color name="settingslib_materialColorInversePrimary">@android:color/system_primary_light</color> - <color name="settingslib_materialColorInverseSurface">@android:color/system_surface_light</color> - <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_dark</color> - <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_dark</color> - <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_dark</color> - <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_dark</color> - <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_dark</color> - <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_dark</color> - <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_dark</color> - <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_dark</color> - <color name="settingslib_materialColorOnError">@android:color/system_on_error_dark</color> - <color name="settingslib_materialColorSurface">@android:color/system_surface_dark</color> - <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_dark</color> - <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_dark</color> - <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_dark</color> - <color name="settingslib_materialColorOutline">@android:color/system_outline_dark</color> - <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_dark</color> - <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_dark</color> - <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_dark</color> - <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_dark</color> - <color name="settingslib_materialColorPrimary">@android:color/system_primary_dark</color> - <color name="settingslib_materialColorSecondary">@android:color/system_secondary_dark</color> - <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_dark</color> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-night/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night/colors.xml new file mode 100644 index 000000000000..e57fe4f512fe --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/values-night/colors.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <color name="settingslib_materialColorPrimary">#83D6C7</color> + <color name="settingslib_materialColorOnPrimary">#003730</color> + <color name="settingslib_materialColorPrimaryContainer">#005047</color> + <color name="settingslib_materialColorOnPrimaryContainer">#A1F1E2</color> + <color name="settingslib_materialColorPrimaryInverse">#A1F1E2</color> + <color name="settingslib_materialColorSecondary">#B1CCC6</color> + <color name="settingslib_materialColorOnSecondary">#1C342F</color> + <color name="settingslib_materialColorSecondaryContainer">#334C47</color> + <color name="settingslib_materialColorOnSecondaryContainer">#CCE8E2</color> + <color name="settingslib_materialColorTertiary">#ADCAE5</color> + <color name="settingslib_materialColorOnTertiary">#123349</color> + <color name="settingslib_materialColorTertiaryContainer">#2D4960</color> + <color name="settingslib_materialColorOnTertiaryContainer">#CEE7FF</color> + <color name="settingslib_materialColorError">#F2B8B5</color> + <color name="settingslib_materialColorOnError">#601410</color> + <color name="settingslib_materialColorErrorContainer">#8C1D18</color> + <color name="settingslib_materialColorOnErrorContainer">#F9DEDC</color> + <color name="settingslib_materialColorOutline">#919191</color> + <color name="settingslib_materialColorOutlineVariant">#474747</color> + <color name="settingslib_materialColorBackground">#131313</color> + <color name="settingslib_materialColorOnBackground">#E5E2E1</color> + <color name="settingslib_materialColorSurface">#131313</color> + <color name="settingslib_materialColorOnSurface">#E5E2E1</color> + <color name="settingslib_materialColorSurfaceVariant">#474747</color> + <color name="settingslib_materialColorOnSurfaceVariant">#C7C7C7</color> + <color name="settingslib_materialColorSurfaceInverse">#E5E2E1</color> + <color name="settingslib_materialColorOnSurfaceInverse">#303030</color> + <color name="settingslib_materialColorSurfaceBright">#393939</color> + <color name="settingslib_materialColorSurfaceDim">#131313</color> + <color name="settingslib_materialColorSurfaceContainer">#1F1F1F</color> + <color name="settingslib_materialColorSurfaceContainerLowest">#1B1B1B</color> + <color name="settingslib_materialColorSurfaceContainerLow">#0E0E0E</color> + <color name="settingslib_materialColorSurfaceContainerHigh">#2A2A2A</color> + <color name="settingslib_materialColorSurfaceContainerHighest">#343434</color> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml index fef92b792bec..e000423784c6 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml @@ -92,4 +92,51 @@ <color name="settingslib_spinner_dropdown_color">@android:color/system_neutral2_700</color> <color name="settingslib_list_divider_color">@android:color/system_neutral1_200</color> + + <color name="settingslib_materialColorPrimary">@android:color/system_accent1_600</color> + <color name="settingslib_materialColorOnPrimary">@android:color/system_accent1_0</color> + <color name="settingslib_materialColorPrimaryContainer">@android:color/system_accent1_100</color> + <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_accent1_900</color> + <color name="settingslib_materialColorPrimaryInverse">@android:color/system_accent1_200</color> + <color name="settingslib_materialColorPrimaryFixed">@android:color/system_accent1_100</color> + <color name="settingslib_materialColorPrimaryFixedDim">@android:color/system_accent1_200</color> + <color name="settingslib_materialColorOnPrimaryFixed">@android:color/system_accent1_900</color> + <color name="settingslib_materialColorOnPrimaryFixedVariant">@android:color/system_accent1_700</color> + <color name="settingslib_materialColorSecondary">@android:color/system_accent2_600</color> + <color name="settingslib_materialColorOnSecondary">@android:color/system_accent2_0</color> + <color name="settingslib_materialColorSecondaryContainer">@android:color/system_accent2_100</color> + <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_accent2_900</color> + <color name="settingslib_materialColorSecondaryFixed">@android:color/system_accent2_100</color> + <color name="settingslib_materialColorSecondaryFixedDim">@android:color/system_accent2_200</color> + <color name="settingslib_materialColorOnSecondaryFixed">@android:color/system_accent2_900</color> + <color name="settingslib_materialColorOnSecondaryFixedVariant">@android:color/system_accent2_700</color> + <color name="settingslib_materialColorTertiary">@android:color/system_accent3_600</color> + <color name="settingslib_materialColorOnTertiary">@android:color/system_accent3_0</color> + <color name="settingslib_materialColorTertiaryContainer">@android:color/system_accent3_100</color> + <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_accent3_900</color> + <color name="settingslib_materialColorTertiaryFixed">@android:color/system_accent3_100</color> + <color name="settingslib_materialColorTertiaryFixedDim">@android:color/system_accent3_200</color> + <color name="settingslib_materialColorOnTertiaryFixed">@android:color/system_accent3_900</color> + <color name="settingslib_materialColorOnTertiaryFixedVariant">@android:color/system_accent3_700</color> + <color name="settingslib_materialColorError">@color/settingslib_error_600</color> + <color name="settingslib_materialColorOnError">@android:color/white</color> + <color name="settingslib_materialColorErrorContainer">@color/settingslib_error_100</color> + <color name="settingslib_materialColorOnErrorContainer">@color/settingslib_error_900</color> + <color name="settingslib_materialColorOutline">@android:color/system_neutral2_500</color> + <color name="settingslib_materialColorOutlineVariant">@android:color/system_neutral2_200</color> + <color name="settingslib_materialColorBackground">@android:color/white</color> + <color name="settingslib_materialColorOnBackground">@android:color/system_neutral1_900</color> + <color name="settingslib_materialColorSurface">@color/settingslib_neutral_variant98</color> + <color name="settingslib_materialColorOnSurface">@android:color/system_neutral1_900</color> + <color name="settingslib_materialColorSurfaceVariant">@android:color/system_neutral2_100</color> + <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_neutral2_700</color> + <color name="settingslib_materialColorSurfaceInverse">@android:color/system_neutral1_800</color> + <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_neutral1_50</color> + <color name="settingslib_materialColorSurfaceBright">@color/settingslib_neutral_variant98</color> + <color name="settingslib_materialColorSurfaceDim">@color/settingslib_neutral_variant87</color> + <color name="settingslib_materialColorSurfaceContainer">@color/settingslib_neutral_variant94</color> + <color name="settingslib_materialColorSurfaceContainerLow">@color/settingslib_neutral_variant96</color> + <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_neutral2_0</color> + <color name="settingslib_materialColorSurfaceContainerHigh">@color/settingslib_neutral_variant92</color> + <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_neutral2_100</color> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml index 4860ad361744..8993d0fc71f7 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml @@ -17,6 +17,4 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <bool name="settingslib_config_icon_space_reserved">false</bool> <bool name="settingslib_config_allow_divider">false</bool> - <!-- Name of a font family to use for headlines in SettingsLib. --> - <string name="settingslib_config_headlineFontFamily" translatable="false"></string> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml new file mode 100644 index 000000000000..9d3d70b366aa --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + <style name="SettingsLibButtonStyle.Expressive.Filled" + parent="@style/Widget.Material3.Button"> + <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">center</item> + <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item> + <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item> + <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item> + <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item> + <item name="android:backgroundTint">@color/settingslib_materialColorPrimary</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.LabelLarge</item> + <item name="android:textColor">@color/settingslib_materialColorOnPrimary</item> + <item name="iconGravity">textStart</item> + <item name="iconTint">@color/settingslib_materialColorOnPrimary</item> + <item name="iconSize">@dimen/settingslib_expressive_space_small4</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Filled.Large"> + <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item> + <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleMedium</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Filled.Extra" + parent="@style/SettingsLibButtonStyle.Expressive.Filled.Large"> + <item name="android:layout_width">match_parent</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Tonal" + parent="@style/Widget.Material3.Button.TonalButton"> + <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">center</item> + <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item> + <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item> + <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item> + <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item> + <item name="android:backgroundTint">@color/settingslib_materialColorSecondaryContainer</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.LabelLarge</item> + <item name="android:textColor">@color/settingslib_materialColorOnSecondaryContainer</item> + <item name="iconGravity">textStart</item> + <item name="iconTint">@color/settingslib_materialColorOnSecondaryContainer</item> + <item name="iconSize">@dimen/settingslib_expressive_space_small4</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Tonal.Large"> + <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item> + <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleMedium</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Tonal.Extra" + parent="@style/SettingsLibButtonStyle.Expressive.Tonal.Large"> + <item name="android:layout_width">match_parent</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Outline" + parent="@style/Widget.Material3.Button.OutlinedButton.Icon"> + <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">center</item> + <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item> + <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item> + <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item> + <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.LabelLarge</item> + <item name="android:textColor">@color/settingslib_materialColorPrimary</item> + <item name="iconTint">@color/settingslib_materialColorPrimary</item> + <item name="iconGravity">textStart</item> + <item name="iconSize">@dimen/settingslib_expressive_space_small4</item> + <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item> + <item name="strokeColor">@color/settingslib_materialColorOutlineVariant</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Outline.Large"> + <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item> + <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleMedium</item> + </style> + + <style name="SettingsLibButtonStyle.Expressive.Outline.Extra" + parent="@style/SettingsLibButtonStyle.Expressive.Outline.Large"> + <item name="android:layout_width">match_parent</item> + </style> + + <style name="SettingslibTextButtonStyle.Expressive" + parent="@style/Widget.Material3.Button.TextButton.Icon"> + <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.BodyLarge.Emphasized</item> + <item name="android:textColor">@color/settingslib_materialColorOnSurface</item> + <item name="iconTint">@null</item> + <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item> + <item name="rippleColor">?android:attr/colorControlHighlight</item> + </style> + + <style name="SettingsLibCardStyle" parent=""> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginHorizontal">?android:attr/listPreferredItemPaddingStart</item> + <item name="android:layout_marginVertical">@dimen/settingslib_expressive_space_extrasmall4</item> + <item name="cardBackgroundColor">@color/settingslib_materialColorPrimary</item> + <item name="cardCornerRadius">@dimen/settingslib_expressive_radius_extralarge3</item> + <item name="cardElevation">0dp</item> + <item name="rippleColor">?android:attr/colorControlHighlight</item> + </style> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v33/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v33/styles_expressive.xml new file mode 100644 index 000000000000..74bf55a8a625 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/values-v33/styles_expressive.xml @@ -0,0 +1,306 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + <style name="TextAppearance.SettingsLib.DisplayLarge" + parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">57sp</item> + <item name="android:letterSpacing">-0.00438596</item> + <item name="android:lineHeight">64sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplayMedium" + parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">45sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">52sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplaySmall" + parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">36sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">44sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.HeadlineLarge" + parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">32sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">40sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineMedium" + parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">28sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">36sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineSmall" + parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">24sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">32sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.TitleLarge" + parent="@android:style/TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">22sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">28sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleMedium" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.009375</item> + <item name="android:lineHeight">24sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleSmall" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight">20sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.LabelLarge" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight">20sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelMedium" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.04166667</item> + <item name="android:lineHeight">16sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelSmall" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">11sp</item> + <item name="android:letterSpacing">0.04545455</item> + <item name="android:lineHeight">16sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.BodyLarge" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.03125</item> + <item name="android:lineHeight">24sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodyMedium" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.01785714</item> + <item name="android:lineHeight">20sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodySmall" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.03333333</item> + <item name="android:lineHeight">16sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.DisplayLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">57sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">64sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplayMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">45sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">52sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplaySmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">36sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">44sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.HeadlineLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">32sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">40sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">28sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">36sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineSmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">24sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">32sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.TitleLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">22sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight">28sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.009375</item> + <item name="android:lineHeight">24sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleSmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight">20sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.LabelLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight">20sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.04166667</item> + <item name="android:lineHeight">16sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelSmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">11sp</item> + <item name="android:letterSpacing">0.04545455</item> + <item name="android:lineHeight">16sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.BodyLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textStyle">normal</item> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.009375</item> + <item name="android:lineHeight">24sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodyMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textStyle">normal</item> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.01785714</item> + <item name="android:lineHeight">20sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodySmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textStyle">normal</item> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.03333333</item> + <item name="android:lineHeight">16sp</item> + <item name="android:hyphenationFrequency">normalFast</item> + <item name="android:lineBreakWordStyle">phrase</item> + <item name="android:textAllCaps">false</item> + </style> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml index 185ac3e1fe73..60642e617a81 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml @@ -43,4 +43,51 @@ <color name="settingslib_text_color_primary_device_default">@android:color/system_on_surface_light</color> <!--Deprecated. After sdk 35 don't use it. using materialColorOnSurfaceVariant--> <color name="settingslib_text_color_secondary_device_default">@android:color/system_on_surface_variant_light</color> + + <color name="settingslib_materialColorPrimary">@android:color/system_primary_light</color> + <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_light</color> + <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_light</color> + <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_light</color> + <color name="settingslib_materialColorPrimaryInverse">@android:color/system_primary_dark</color> + <color name="settingslib_materialColorPrimaryFixed">@android:color/system_primary_fixed</color> + <color name="settingslib_materialColorPrimaryFixedDim">@android:color/system_primary_fixed_dim</color> + <color name="settingslib_materialColorOnPrimaryFixed">@android:color/system_on_primary_fixed</color> + <color name="settingslib_materialColorOnPrimaryFixedVariant">@android:color/system_on_primary_fixed_variant</color> + <color name="settingslib_materialColorSecondary">@android:color/system_secondary_light</color> + <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_light</color> + <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_light</color> + <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_light</color> + <color name="settingslib_materialColorSecondaryFixed">@android:color/system_secondary_fixed</color> + <color name="settingslib_materialColorSecondaryFixedDim">@android:color/system_secondary_fixed_dim</color> + <color name="settingslib_materialColorOnSecondaryFixed">@android:color/system_on_secondary_fixed</color> + <color name="settingslib_materialColorOnSecondaryFixedVariant">@android:color/system_on_secondary_fixed_variant</color> + <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_light</color> + <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_light</color> + <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_light</color> + <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_light</color> + <color name="settingslib_materialColorTertiaryFixed">@android:color/system_tertiary_fixed</color> + <color name="settingslib_materialColorTertiaryFixedDim">@android:color/system_tertiary_fixed_dim</color> + <color name="settingslib_materialColorOnTertiaryFixed">@android:color/system_on_tertiary_fixed</color> + <color name="settingslib_materialColorOnTertiaryFixedVariant">@android:color/system_on_tertiary_fixed_variant</color> + <color name="settingslib_materialColorError">@android:color/system_error_light</color> + <color name="settingslib_materialColorOnError">@android:color/system_on_error_light</color> + <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_light</color> + <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_light</color> + <color name="settingslib_materialColorOutline">@android:color/system_outline_light</color> + <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_light</color> + <color name="settingslib_materialColorBackground">@android:color/system_background_light</color> + <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_light</color> + <color name="settingslib_materialColorSurface">@android:color/system_surface_light</color> + <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_light</color> + <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_light</color> + <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_light</color> + <color name="settingslib_materialColorSurfaceInverse">@android:color/system_surface_dark</color> + <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_on_surface_dark</color> + <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_light</color> + <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_light</color> + <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_light</color> + <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_light</color> + <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_light</color> + <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_light</color> + <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_light</color> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml index 90c19e1aa676..b1b37b12c572 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml @@ -54,49 +54,4 @@ <color name="settingslib_spinner_title_color">@color/settingslib_materialColorOnPrimaryContainer</color> <!-- The text color of dropdown item title --> <color name="settingslib_spinner_dropdown_color">@color/settingslib_materialColorOnPrimaryContainer</color> - - <color name="settingslib_materialColorOnSecondaryFixedVariant">@android:color/system_on_secondary_fixed_variant</color> - <color name="settingslib_materialColorOnTertiaryFixedVariant">@android:color/system_on_tertiary_fixed_variant</color> - <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_light</color> - <color name="settingslib_materialColorOnPrimaryFixedVariant">@android:color/system_on_primary_fixed_variant</color> - <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_light</color> - <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_light</color> - <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_light</color> - <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_light</color> - <color name="settingslib_materialColorSecondaryFixedDim">@android:color/system_secondary_fixed_dim</color> - <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_light</color> - <color name="settingslib_materialColorOnSecondaryFixed">@android:color/system_on_secondary_fixed</color> - <color name="settingslib_materialColorInverseOnSurface">@android:color/system_on_surface_dark</color> - <color name="settingslib_materialColorTertiaryFixedDim">@android:color/system_tertiary_fixed_dim</color> - <color name="settingslib_materialColorOnTertiaryFixed">@android:color/system_on_tertiary_fixed</color> - <color name="settingslib_materialColorPrimaryFixedDim">@android:color/system_primary_fixed_dim</color> - <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_light</color> - <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_light</color> - <color name="settingslib_materialColorOnPrimaryFixed">@android:color/system_on_primary_fixed</color> - <color name="settingslib_materialColorInversePrimary">@android:color/system_primary_dark</color> - <color name="settingslib_materialColorSecondaryFixed">@android:color/system_secondary_fixed</color> - <color name="settingslib_materialColorInverseSurface">@android:color/system_surface_dark</color> - <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_light</color> - <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_light</color> - <color name="settingslib_materialColorTertiaryFixed">@android:color/system_tertiary_fixed</color> - <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_light</color> - <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_light</color> - <color name="settingslib_materialColorPrimaryFixed">@android:color/system_primary_fixed</color> - <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_light</color> - <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_light</color> - <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_light</color> - <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_light</color> - <color name="settingslib_materialColorOnError">@android:color/system_on_error_light</color> - <color name="settingslib_materialColorSurface">@android:color/system_surface_light</color> - <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_light</color> - <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_light</color> - <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_light</color> - <color name="settingslib_materialColorOutline">@android:color/system_outline_light</color> - <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_light</color> - <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_light</color> - <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_light</color> - <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_light</color> - <color name="settingslib_materialColorPrimary">@android:color/system_primary_light</color> - <color name="settingslib_materialColorSecondary">@android:color/system_secondary_light</color> - <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_light</color> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml index 05a1ceacdb65..1a085681864a 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml @@ -16,150 +16,6 @@ --> <resources> - <style name="SettingsLibTextAppearance" parent="@android:style/TextAppearance.DeviceDefault"> - <!--item name="android:fontFamily"></item--> - <item name="android:hyphenationFrequency">normalFast</item> - <item name="android:lineBreakWordStyle">phrase</item> - </style> - - <style name="SettingsLibTextAppearance.Primary"> - <!--item name="android:fontFamily"></item--> - </style> - - <style name="SettingsLibTextAppearance.Primary.Display"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Primary.Display.Large"> - <item name="android:textSize">57sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Display.Medium"> - <item name="android:textSize">45sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Display.Small"> - <item name="android:textSize">36sp</item> - </style> - - <style name="SettingsLibTextAppearance.Primary.Headline"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Primary.Headline.Large"> - <item name="android:textSize">32sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Headline.Medium"> - <item name="android:textSize">28sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Headline.Small"> - <item name="android:textSize">24sp</item> - </style> - - <style name="SettingsLibTextAppearance.Primary.Title"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Primary.Title.Large"> - <item name="android:textSize">22sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Title.Medium"> - <item name="android:textSize">16sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Title.Small"> - <item name="android:textSize">14sp</item> - </style> - - <style name="SettingsLibTextAppearance.Primary.Label"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Primary.Label.Large"> - <item name="android:textSize">14sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Label.Medium"> - <item name="android:textSize">12sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Label.Small"> - <item name="android:textSize">11sp</item> - </style> - - <style name="SettingsLibTextAppearance.Primary.Body"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Primary.Body.Large"> - <item name="android:textSize">16sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Body.Medium"> - <item name="android:textSize">14sp</item> - </style> - <style name="SettingsLibTextAppearance.Primary.Body.Small"> - <item name="android:textSize">12sp</item> - </style> - - <style name="SettingsLibTextAppearance.Emphasized"> - <!--item name="android:fontFamily"></item--> - </style> - - <style name="SettingsLibTextAppearance.Emphasized.Display"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Display.Large"> - <item name="android:textSize">57sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Display.Medium"> - <item name="android:textSize">45sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Display.Small"> - <item name="android:textSize">36sp</item> - </style> - - <style name="SettingsLibTextAppearance.Emphasized.Headline"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Headline.Large"> - <item name="android:textSize">32sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Headline.Medium"> - <item name="android:textSize">28sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Headline.Small"> - <item name="android:textSize">24sp</item> - </style> - - <style name="SettingsLibTextAppearance.Emphasized.Title"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Title.Large"> - <item name="android:textSize">22sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Title.Medium"> - <item name="android:textSize">16sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Title.Small"> - <item name="android:textSize">14sp</item> - </style> - - <style name="SettingsLibTextAppearance.Emphasized.Label"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Label.Large"> - <item name="android:textSize">14sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Label.Medium"> - <item name="android:textSize">12sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Label.Small"> - <item name="android:textSize">11sp</item> - </style> - - <style name="SettingsLibTextAppearance.Emphasized.Body"> - <!--item name="android:fontFamily"></item--> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Body.Large"> - <item name="android:textSize">16sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Body.Medium"> - <item name="android:textSize">14sp</item> - </style> - <style name="SettingsLibTextAppearance.Emphasized.Body.Small"> - <item name="android:textSize">12sp</item> - </style> - <style name="SettingslibSwitchStyle.Expressive" parent=""> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> @@ -175,122 +31,6 @@ <item name="trackTint">@color/settingslib_expressive_color_main_switch_track</item> </style> - <style name="SettingsLibCardStyle" parent=""> - <item name="android:layout_width">match_parent</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_marginHorizontal">?android:attr/listPreferredItemPaddingStart</item> - <item name="android:layout_marginVertical">@dimen/settingslib_expressive_space_extrasmall4</item> - <item name="cardBackgroundColor">@color/settingslib_materialColorPrimary</item> - <item name="cardCornerRadius">@dimen/settingslib_expressive_radius_extralarge3</item> - <item name="cardElevation">0dp</item> - <item name="rippleColor">?android:attr/colorControlHighlight</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Filled" - parent="@style/Widget.Material3.Button"> - <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:gravity">center</item> - <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item> - <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item> - <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item> - <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item> - <item name="android:backgroundTint">@color/settingslib_materialColorPrimary</item> - <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item> - <item name="android:textColor">@color/settingslib_materialColorOnPrimary</item> - <item name="android:textSize">14sp</item> - <item name="iconGravity">textStart</item> - <item name="iconTint">@color/settingslib_materialColorOnPrimary</item> - <item name="iconSize">@dimen/settingslib_expressive_space_small4</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Filled.Large"> - <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item> - <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item> - <item name="android:textSize">16sp</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Filled.Extra" - parent="@style/SettingsLibButtonStyle.Expressive.Filled.Large"> - <item name="android:layout_width">match_parent</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Tonal" - parent="@style/Widget.Material3.Button.TonalButton"> - <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:gravity">center</item> - <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item> - <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item> - <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item> - <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item> - <item name="android:backgroundTint">@color/settingslib_materialColorSecondaryContainer</item> - <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item> - <item name="android:textColor">@color/settingslib_materialColorOnSecondaryContainer</item> - <item name="android:textSize">14sp</item> - <item name="iconGravity">textStart</item> - <item name="iconTint">@color/settingslib_materialColorOnSecondaryContainer</item> - <item name="iconSize">@dimen/settingslib_expressive_space_small4</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Tonal.Large"> - <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item> - <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item> - <item name="android:textSize">16sp</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Tonal.Extra" - parent="@style/SettingsLibButtonStyle.Expressive.Tonal.Large"> - <item name="android:layout_width">match_parent</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Outline" - parent="@style/Widget.Material3.Button.OutlinedButton.Icon"> - <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:gravity">center</item> - <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item> - <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item> - <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item> - <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item> - <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item> - <item name="android:textColor">@color/settingslib_materialColorPrimary</item> - <item name="android:textSize">14sp</item> - <item name="iconTint">@color/settingslib_materialColorPrimary</item> - <item name="iconGravity">textStart</item> - <item name="iconSize">@dimen/settingslib_expressive_space_small4</item> - <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item> - <item name="strokeColor">@color/settingslib_materialColorOutlineVariant</item> - - </style> - - <style name="SettingsLibButtonStyle.Expressive.Outline.Large"> - <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item> - <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item> - <item name="android:textSize">16sp</item> - </style> - - <style name="SettingsLibButtonStyle.Expressive.Outline.Extra" - parent="@style/SettingsLibButtonStyle.Expressive.Outline.Large"> - <item name="android:layout_width">match_parent</item> - </style> - - <style name="SettingslibTextButtonStyle.Expressive" - parent="@style/Widget.Material3.Button.TextButton.Icon"> - <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item> - <item name="android:textSize">16sp</item> - <item name="android:textColor">@color/settingslib_materialColorOnSurface</item> - <item name="iconTint">@null</item> - <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item> - <item name="rippleColor">?android:attr/colorControlHighlight</item> - </style> - <style name="EntityHeader"> <item name="android:paddingTop">@dimen/settingslib_expressive_space_small4</item> <item name="android:paddingBottom">@dimen/settingslib_expressive_space_small1</item> @@ -327,12 +67,11 @@ <item name="android:gravity">center</item> <item name="android:ellipsize">marquee</item> <item name="android:textDirection">locale</item> - <item name="android:textAppearance">@style/TextAppearance.EntityHeaderTitle</item> + <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleLarge.Emphasized</item> </style> <style name="SettingslibTextAppearance.LinkableTextStyle.Expressive" - parent="@android:style/TextAppearance.DeviceDefault.WindowTitle"> - <item name="android:textSize">14sp</item> + parent="@style/TextAppearance.SettingsLib.LabelLarge"> <item name="android:textColor">?android:attr/colorAccent</item> </style> @@ -346,4 +85,14 @@ <item name="cardElevation">0dp</item> <item name="rippleColor">?android:attr/colorControlHighlight</item> </style> + + <style name="TextAppearance.SettingsLib.PreferenceTitle" + parent="@style/TextAppearance.SettingsLib.TitleMedium"> + <item name="android:textColor">@color/settingslib_text_color_primary</item> + </style> + + <style name="TextAppearance.SettingsLib.PreferenceSummary" + parent="@style/TextAppearance.SettingsLib.BodyMedium"> + <item name="android:textColor">@color/settingslib_text_color_secondary</item> + </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml index fea8739ab37d..14f214a96435 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml @@ -18,8 +18,8 @@ <resources> <style name="Theme.SettingsBase.Expressive"> <!-- Set up Preference title text style --> - <!--item name="android:textAppearanceListItem">@style/TextAppearance.PreferenceTitle.SettingsLib</item--> - <!--item name="android:textAppearanceListItemSecondary">@style/textAppearanceListItemSecondary</item--> + <item name="android:textAppearanceListItem">@style/TextAppearance.SettingsLib.PreferenceTitle</item> + <item name="android:textAppearanceListItemSecondary">@style/TextAppearance.SettingsLib.PreferenceSummary</item> <!-- Set up list item padding --> <item name="android:listPreferredItemPaddingStart">@dimen/settingslib_expressive_space_small1</item> diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values/attrs_expressive.xml index 857dd7953234..857dd7953234 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values/attrs_expressive.xml diff --git a/packages/SettingsLib/SettingsTheme/res/values/colors.xml b/packages/SettingsLib/SettingsTheme/res/values/colors.xml new file mode 100644 index 000000000000..c5c613b4b329 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/values/colors.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <color name="settingslib_error_0">#FFFFFF</color> + <color name="settingslib_error_10">#FFFBFF</color> + <color name="settingslib_error_50">#FFEDEA</color> + <color name="settingslib_error_100">#FFDAD6</color> + <color name="settingslib_error_200">#FFB4AB</color> + <color name="settingslib_error_300">#FF897D</color> + <color name="settingslib_error_400">#FF5449</color> + <color name="settingslib_error_500">#DE3730</color> + <color name="settingslib_error_600">#BA1A1A</color> + <color name="settingslib_error_700">#93000A</color> + <color name="settingslib_error_800">#690005</color> + <color name="settingslib_error_900">#410002</color> + <color name="settingslib_error_1000">#000000</color> + + <color name="settingslib_materialColorPrimary">#006B5F</color> + <color name="settingslib_materialColorOnPrimary">#FFFFFF</color> + <color name="settingslib_materialColorPrimaryContainer">#C5EAE2</color> + <color name="settingslib_materialColorOnPrimaryContainer">#00201C</color> + <color name="settingslib_materialColorPrimaryInverse">#83D6C7</color> + <color name="settingslib_materialColorPrimaryFixed">#C5EAE2</color> + <color name="settingslib_materialColorPrimaryFixedDim">#82D5C6</color> + <color name="settingslib_materialColorOnPrimaryFixed">#00201C</color> + <color name="settingslib_materialColorOnPrimaryFixedVariant">#005047</color> + <color name="settingslib_materialColorSecondary">#4A635E</color> + <color name="settingslib_materialColorOnSecondary">#FFFFFF</color> + <color name="settingslib_materialColorSecondaryContainer">#CCE8E2</color> + <color name="settingslib_materialColorOnSecondaryContainer">#051F1B</color> + <color name="settingslib_materialColorSecondaryFixed">#CCE8E2</color> + <color name="settingslib_materialColorSecondaryFixedDim">#B1CCC6</color> + <color name="settingslib_materialColorOnSecondaryFixed">#051F1B</color> + <color name="settingslib_materialColorOnSecondaryFixedVariant">#334C47</color> + <color name="settingslib_materialColorTertiary">#456179</color> + <color name="settingslib_materialColorOnTertiary">#FFFFFF</color> + <color name="settingslib_materialColorTertiaryContainer">#CBE6FF</color> + <color name="settingslib_materialColorOnTertiaryContainer">#001E31</color> + <color name="settingslib_materialColorTertiaryFixed">#CBE5FF</color> + <color name="settingslib_materialColorTertiaryFixedDim">#ADCAE5</color> + <color name="settingslib_materialColorOnTertiaryFixed">#001E31</color> + <color name="settingslib_materialColorOnTertiaryFixedVariant">#2D4A60</color> + <color name="settingslib_materialColorError">#B3261E</color> + <color name="settingslib_materialColorOnError">#FFFFFF</color> + <color name="settingslib_materialColorErrorContainer">#F9DEDC</color> + <color name="settingslib_materialColorOnErrorContainer">#3A0A08</color> + <color name="settingslib_materialColorOutline">#777777</color> + <color name="settingslib_materialColorOutlineVariant">#C7C6C5</color> + <color name="settingslib_materialColorBackground">#F9FAF8</color> + <color name="settingslib_materialColorOnBackground">#1B1B1B</color> + <color name="settingslib_materialColorSurface">#F9FAF8</color> + <color name="settingslib_materialColorOnSurface">#1B1B1B</color> + <color name="settingslib_materialColorSurfaceVariant">#E3E3E3</color> + <color name="settingslib_materialColorOnSurfaceVariant">#474747</color> + <color name="settingslib_materialColorSurfaceInverse">#303030</color> + <color name="settingslib_materialColorOnSurfaceInverse">#F1F1F1</color> + <color name="settingslib_materialColorSurfaceBright">#F9FAF8</color> + <color name="settingslib_materialColorSurfaceDim">#DADADA</color> + <color name="settingslib_materialColorSurfaceContainer">#EEEEEE</color> + <color name="settingslib_materialColorSurfaceContainerLow">#F4F4F4</color> + <color name="settingslib_materialColorSurfaceContainerLowest">#FFFFFF</color> + <color name="settingslib_materialColorSurfaceContainerHigh">#E8E8E8</color> + <color name="settingslib_materialColorSurfaceContainerHighest">#E3E3E3</color> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values/config.xml b/packages/SettingsLib/SettingsTheme/res/values/config.xml index e73dcc0cc559..53da49180219 100644 --- a/packages/SettingsLib/SettingsTheme/res/values/config.xml +++ b/packages/SettingsLib/SettingsTheme/res/values/config.xml @@ -16,4 +16,7 @@ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <bool name="settingslib_config_icon_space_reserved">true</bool> + + <!-- Name of a font family to use for headlines in SettingsLib. --> + <string name="settingslib_config_headlineFontFamily" translatable="false"></string> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values/dimens_expressive.xml index 0542c510fa63..0542c510fa63 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values/dimens_expressive.xml diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml new file mode 100644 index 000000000000..f73e100906c8 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml @@ -0,0 +1,253 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:tools="http://schemas.android.com/tools"> + <style name="TextAppearance.SettingsLib.DisplayLarge" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> + <item name="android:textSize">57sp</item> + <item name="android:letterSpacing">-0.00438596</item> + <item name="android:lineHeight" tools:targetApi="28">64sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplayMedium" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> + <item name="android:textSize">45sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">52sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplaySmall" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> + <item name="android:textSize">36sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">44sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.HeadlineLarge" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> + <item name="android:textSize">32sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">40sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineMedium" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> + <item name="android:textSize">28sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">36sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineSmall" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> + <item name="android:textSize">24sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">32sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.TitleLarge" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> + <item name="android:textSize">22sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">28sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleMedium" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.009375</item> + <item name="android:lineHeight" tools:targetApi="28">24sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleSmall" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight" tools:targetApi="28">20sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.LabelLarge" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight" tools:targetApi="28">20sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelMedium" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.04166667</item> + <item name="android:lineHeight" tools:targetApi="28">16sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelSmall" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textSize">11sp</item> + <item name="android:letterSpacing">0.04545455</item> + <item name="android:lineHeight" tools:targetApi="28">16sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.BodyLarge" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.03125</item> + <item name="android:lineHeight" tools:targetApi="28">24sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodyMedium" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.01785714</item> + <item name="android:lineHeight" tools:targetApi="28">20sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodySmall" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.03333333</item> + <item name="android:lineHeight" tools:targetApi="28">16sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.DisplayLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">57sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">64sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplayMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">45sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">52sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.DisplaySmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">36sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">44sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.HeadlineLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">32sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">40sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">28sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">36sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.HeadlineSmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">24sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">32sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.TitleLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <item name="android:textSize">22sp</item> + <item name="android:letterSpacing">0</item> + <item name="android:lineHeight" tools:targetApi="28">28sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.009375</item> + <item name="android:lineHeight" tools:targetApi="28">24sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.TitleSmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight" tools:targetApi="28">20sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.LabelLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.00714286</item> + <item name="android:lineHeight" tools:targetApi="28">20sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.04166667</item> + <item name="android:lineHeight" tools:targetApi="28">16sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.LabelSmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textStyle">bold</item> + <item name="android:textSize">11sp</item> + <item name="android:letterSpacing">0.04545455</item> + <item name="android:lineHeight" tools:targetApi="28">16sp</item> + <item name="android:textAllCaps">false</item> + </style> + + <style name="TextAppearance.SettingsLib.BodyLarge.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textStyle">normal</item> + <item name="android:textSize">16sp</item> + <item name="android:letterSpacing">0.009375</item> + <item name="android:lineHeight" tools:targetApi="28">24sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodyMedium.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textStyle">normal</item> + <item name="android:textSize">14sp</item> + <item name="android:letterSpacing">0.01785714</item> + <item name="android:lineHeight" tools:targetApi="28">20sp</item> + <item name="android:textAllCaps">false</item> + </style> + <style name="TextAppearance.SettingsLib.BodySmall.Emphasized" + parent="@android:style/TextAppearance.DeviceDefault.Medium"> + <item name="android:textStyle">normal</item> + <item name="android:textSize">12sp</item> + <item name="android:letterSpacing">0.03333333</item> + <item name="android:lineHeight" tools:targetApi="28">16sp</item> + <item name="android:textAllCaps">false</item> + </style> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts index 02e190417853..cf695d0543c7 100644 --- a/packages/SettingsLib/Spa/build.gradle.kts +++ b/packages/SettingsLib/Spa/build.gradle.kts @@ -14,14 +14,13 @@ * limitations under the License. */ -import com.android.build.api.dsl.CommonExtension import com.android.build.gradle.BaseExtension import com.android.build.gradle.api.AndroidBasePlugin -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false + alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.kotlin.android) apply false } @@ -51,23 +50,4 @@ subprojects { } } } - - afterEvaluate { - plugins.withType<AndroidBasePlugin> { - the(CommonExtension::class).apply { - if (buildFeatures.compose == true) { - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() - } - } - } - } - } - - tasks.withType<KotlinCompile> { - kotlinOptions { - jvmTarget = libs.versions.jvm.get() - freeCompilerArgs = listOf("-Xjvm-default=all") - } - } } diff --git a/packages/SettingsLib/Spa/gallery/build.gradle.kts b/packages/SettingsLib/Spa/gallery/build.gradle.kts index a1151a5e827e..19aa710babd3 100644 --- a/packages/SettingsLib/Spa/gallery/build.gradle.kts +++ b/packages/SettingsLib/Spa/gallery/build.gradle.kts @@ -16,6 +16,7 @@ plugins { alias(libs.plugins.android.application) + alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlin.android) } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt index f7649b91f558..17f996567ce7 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt @@ -20,11 +20,13 @@ import android.os.Bundle import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.DisabledByDefault import androidx.compose.runtime.Composable +import androidx.compose.runtime.IntState import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.produceState import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -33,8 +35,11 @@ import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R +import com.android.settingslib.spa.widget.preference.ListPreferenceModel +import com.android.settingslib.spa.widget.preference.ListPreferenceOption import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel +import com.android.settingslib.spa.widget.preference.RadioPreferences import com.android.settingslib.spa.widget.scaffold.RegularScaffold import com.android.settingslib.spa.widget.ui.Category import com.android.settingslib.spa.widget.ui.SettingsIcon @@ -103,6 +108,22 @@ object PreferencePageProvider : SettingsPageProvider { override val summary = { ticks.toString() } }) } + val selectedId = rememberSaveable { mutableIntStateOf(0) } + RadioPreferences( + object : ListPreferenceModel { + override val title: String = "RadioPreferences" + override val options: List<ListPreferenceOption> = + listOf( + ListPreferenceOption(id = 0, text = "option1"), + ListPreferenceOption(id = 1, text = "option2"), + ListPreferenceOption(id = 2, text = "option3"), + ) + override val selectedId: IntState = selectedId + override val onIdSelected: (Int) -> Unit = { + selectedId.intValue = it + } + } + ) } } diff --git a/packages/SettingsLib/Spa/gradle/libs.versions.toml b/packages/SettingsLib/Spa/gradle/libs.versions.toml index 74811d3ae7a6..04ef96a89843 100644 --- a/packages/SettingsLib/Spa/gradle/libs.versions.toml +++ b/packages/SettingsLib/Spa/gradle/libs.versions.toml @@ -15,12 +15,11 @@ # [versions] -agp = "8.7.2" -compose-compiler = "1.5.11" +agp = "8.7.3" dexmaker-mockito = "2.28.3" jvm = "17" -kotlin = "1.9.23" -truth = "1.1.5" +kotlin = "2.0.21" +truth = "1.4.4" [libraries] dexmaker-mockito = { module = "com.linkedin.dexmaker:dexmaker-mockito", version.ref = "dexmaker-mockito" } @@ -29,4 +28,5 @@ truth = { module = "com.google.truth:truth", version.ref = "truth" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } diff --git a/packages/SettingsLib/Spa/spa/build.gradle.kts b/packages/SettingsLib/Spa/spa/build.gradle.kts index 1f32ad6622a2..a0bbb0ca9ae6 100644 --- a/packages/SettingsLib/Spa/spa/build.gradle.kts +++ b/packages/SettingsLib/Spa/spa/build.gradle.kts @@ -16,6 +16,7 @@ plugins { alias(libs.plugins.android.library) + alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlin.android) jacoco } @@ -41,9 +42,6 @@ android { manifest.srcFile("../tests/AndroidManifest.xml") } } - buildFeatures { - compose = true - } buildTypes { getByName("debug") { enableAndroidTestCoverage = true @@ -63,7 +61,7 @@ dependencies { api("androidx.lifecycle:lifecycle-runtime-compose") api("androidx.navigation:navigation-compose:2.9.0-alpha03") api("com.github.PhilJay:MPAndroidChart:v3.1.0-alpha") - api("com.google.android.material:material:1.12.0") + api("com.google.android.material:material:1.13.0-alpha08") debugApi("androidx.compose.ui:ui-tooling:$jetpackComposeVersion") implementation("com.airbnb.android:lottie-compose:6.4.0") diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt index 8300ce855988..ec94df057b77 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt @@ -16,28 +16,34 @@ package com.android.settingslib.spa.widget.preference -import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.selection.selectableGroup +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.IntState +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.Role +import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.compose.thenIf import com.android.settingslib.spa.framework.theme.SettingsDimension -import com.android.settingslib.spa.widget.ui.CategoryTitle +import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled +import com.android.settingslib.spa.widget.ui.Category import com.android.settingslib.spa.widget.ui.SettingsListItem @Composable fun RadioPreferences(model: ListPreferenceModel) { - CategoryTitle(title = model.title) - Spacer(modifier = Modifier.width(SettingsDimension.itemDividerHeight)) - Column(modifier = Modifier.selectableGroup()) { + Category(modifier = Modifier.selectableGroup(), title = model.title) { for (option in model.options) { Radio2(option, model.selectedId.intValue, model.enabled()) { model.onIdSelected(it) @@ -54,20 +60,52 @@ fun Radio2( onIdSelected: (id: Int) -> Unit, ) { val selected = option.id == selectedId + val surfaceBright = MaterialTheme.colorScheme.surfaceBright Row( - modifier = Modifier - .fillMaxWidth() - .selectable( - selected = selected, - enabled = enabled, - onClick = { onIdSelected(option.id) }, - role = Role.RadioButton, - ) - .padding(SettingsDimension.dialogItemPadding), + modifier = + Modifier.fillMaxWidth() + .thenIf(isSpaExpressiveEnabled) { + Modifier.heightIn(min = SettingsDimension.preferenceMinHeight) + .background(surfaceBright) + } + .selectable( + selected = selected, + enabled = enabled, + onClick = { onIdSelected(option.id) }, + role = Role.RadioButton, + ) + .then( + if (isSpaExpressiveEnabled) Modifier.padding(SettingsDimension.itemPadding) + else Modifier.padding(SettingsDimension.dialogItemPadding) + ), verticalAlignment = Alignment.CenterVertically, ) { RadioButton(selected = selected, onClick = null, enabled = enabled) - Spacer(modifier = Modifier.width(SettingsDimension.itemDividerHeight)) + Spacer( + modifier = + Modifier.width( + if (isSpaExpressiveEnabled) SettingsDimension.paddingExtraSmall6 + else SettingsDimension.itemDividerHeight + ) + ) SettingsListItem(text = option.text, enabled = enabled) } -}
\ No newline at end of file +} + +@Preview +@Composable +private fun RadioPreferencePreview() { + RadioPreferences( + object : ListPreferenceModel { + override val title: String = "Title" + override val options: List<ListPreferenceOption> = + listOf( + ListPreferenceOption(id = 0, text = "option1"), + ListPreferenceOption(id = 1, text = "option2"), + ListPreferenceOption(id = 2, text = "option3"), + ) + override val selectedId: IntState = remember { mutableIntStateOf(0) } + override val onIdSelected: (Int) -> Unit = {} + } + ) +} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt index 96d2abb70391..62bc00a8b347 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt @@ -76,7 +76,7 @@ fun CategoryTitle(title: String) { * visually separates groups of items. */ @Composable -fun Category(title: String? = null, content: @Composable ColumnScope.() -> Unit) { +fun Category(title: String? = null, modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit) { var displayTitle by remember { mutableStateOf(false) } Column( modifier = @@ -90,7 +90,7 @@ fun Category(title: String? = null, content: @Composable ColumnScope.() -> Unit) if (title != null && displayTitle) CategoryTitle(title = title) Column( modifier = - Modifier.onGloballyPositioned { coordinates -> + modifier.onGloballyPositioned { coordinates -> displayTitle = coordinates.size.height > 0 } .then( @@ -162,7 +162,7 @@ internal val LocalIsInCategory = compositionLocalOf { false } @Composable private fun CategoryPreview() { SettingsTheme { - Category("Appearance") { + Category(title = "Appearance") { Preference( object : PreferenceModel { override val title = "Title" diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt index 2f98b02b8dd5..d187017f5021 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt @@ -43,7 +43,9 @@ class RadioPreferencesTest { RadioPreferences(remember { object : ListPreferenceModel { override val title = TITLE - override val options = emptyList<ListPreferenceOption>() + override val options = listOf( + ListPreferenceOption(id = 1, text = "A") + ) override val selectedId = mutableIntStateOf(0) override val onIdSelected: (Int) -> Unit = {} } diff --git a/packages/SettingsLib/Spa/testutils/build.gradle.kts b/packages/SettingsLib/Spa/testutils/build.gradle.kts index cce82354a51f..7dbd320c7d5a 100644 --- a/packages/SettingsLib/Spa/testutils/build.gradle.kts +++ b/packages/SettingsLib/Spa/testutils/build.gradle.kts @@ -16,6 +16,7 @@ plugins { alias(libs.plugins.android.library) + alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlin.android) } @@ -30,9 +31,6 @@ android { manifest.srcFile("AndroidManifest.xml") } } - buildFeatures { - compose = true - } } dependencies { diff --git a/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml index 9a3e5b9e1e50..083b862e8a5c 100644 --- a/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml +++ b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml @@ -72,7 +72,7 @@ android:layout_height="wrap_content" android:hyphenationFrequency="normalFast" android:lineBreakWordStyle="phrase" - android:textAppearance="@style/SettingsLibTextAppearance.Emphasized.Title.Large"/> + android:textAppearance="@style/TextAppearance.SettingsLib.TitleLarge.Emphasized"/> <TextView android:id="@android:id/summary" @@ -81,7 +81,7 @@ android:hyphenationFrequency="normalFast" android:lineBreakWordStyle="phrase" android:maxLines="3" - android:textAppearance="@style/SettingsLibTextAppearance.Primary.Body.Medium"/> + android:textAppearance="@style/TextAppearance.SettingsLib.BodyMedium"/> </LinearLayout> </LinearLayout> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index ac436ad5d61a..9af8ba842a61 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -621,7 +621,7 @@ <string name="shared_data_delete_failure_text" msgid="3842701391009628947">"Kon nie die gedeelde data uitvee nie."</string> <string name="shared_data_no_accessors_dialog_text" msgid="8903738462570715315">"Daar is geen huurkontrakte vir hierdie gedeelde data verkry nie. Wil jy dit uitvee?"</string> <string name="accessor_info_title" msgid="8289823651512477787">"Programme wat data deel"</string> - <string name="accessor_no_description_text" msgid="7510967452505591456">"Geen beskrywing is deur die program voorsien nie."</string> + <string name="accessor_no_description_text" msgid="7510967452505591456">"Geen beskrywing is deur die app voorsien nie."</string> <string name="accessor_expires_text" msgid="4625619273236786252">"Huurkontrak verval op <xliff:g id="DATE">%s</xliff:g>"</string> <string name="delete_blob_text" msgid="2819192607255625697">"Vee gedeelde data uit?"</string> <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"Is jy seker jy wil hierdie gedeelde data uitvee?"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 0b933a33c3f8..cd6cfdfbf1ec 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -239,7 +239,7 @@ <string name="category_work" msgid="4014193632325996115">"Աշխատանքային"</string> <string name="category_private" msgid="4244892185452788977">"Մասնավոր"</string> <string name="category_clone" msgid="1554511758987195974">"Կլոն"</string> - <string name="development_settings_title" msgid="140296922921597393">"Մշակողի ընտրանքներ"</string> + <string name="development_settings_title" msgid="140296922921597393">"Ծրագրավորողի ընտրանքներ"</string> <string name="development_settings_enable" msgid="4285094651288242183">"Միացնել մշակողի ընտրանքները"</string> <string name="development_settings_summary" msgid="8718917813868735095">"Կարգավորել ընտրանքները ծրագրի ծրագրավորման համար"</string> <string name="development_settings_not_available" msgid="355070198089140951">"Ծրագրավորման ընտրանքներն այլևս հասանելի չեն այս օգտատիրոջ"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 724899972297..87e03dc7ca19 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -128,7 +128,7 @@ <string name="bluetooth_profile_hid" msgid="2969922922664315866">"输入设备"</string> <string name="bluetooth_profile_pan" msgid="1006235139308318188">"互联网连接"</string> <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"允许访问通讯录和通话记录"</string> - <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"信息将用于来电通知等用途"</string> + <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"这些信息将用于来电通知等用途"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"共享互联网连接"</string> <string name="bluetooth_profile_map" msgid="8907204701162107271">"短信"</string> <string name="bluetooth_profile_sap" msgid="8304170950447934386">"SIM 卡访问权限"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/AmbientVolumeController.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/AmbientVolumeController.java new file mode 100644 index 000000000000..7f0c1263570e --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/AmbientVolumeController.java @@ -0,0 +1,415 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.bluetooth; + +import static android.bluetooth.AudioInputControl.MUTE_DISABLED; +import static android.bluetooth.AudioInputControl.MUTE_MUTED; +import static android.bluetooth.AudioInputControl.MUTE_NOT_MUTED; + +import static com.android.settingslib.bluetooth.HearingDeviceLocalDataManager.Data.INVALID_VOLUME; + +import android.bluetooth.AudioInputControl; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.util.ArrayMap; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executor; + +/** + * AmbientVolumeController manages the {@link AudioInputControl}s of + * {@link AudioInputControl#AUDIO_INPUT_TYPE_AMBIENT} on the remote device. + */ +public class AmbientVolumeController implements LocalBluetoothProfileManager.ServiceListener { + + private static final boolean DEBUG = true; + private static final String TAG = "AmbientController"; + + private final LocalBluetoothProfileManager mProfileManager; + private final VolumeControlProfile mVolumeControlProfile; + private final Map<BluetoothDevice, List<AudioInputControl>> mDeviceAmbientControlsMap = + new ArrayMap<>(); + private final Map<BluetoothDevice, AmbientCallback> mDeviceCallbackMap = new ArrayMap<>(); + final Map<BluetoothDevice, RemoteAmbientState> mDeviceAmbientStateMap = + new ArrayMap<>(); + @Nullable + private final AmbientVolumeControlCallback mCallback; + + public AmbientVolumeController( + @NonNull LocalBluetoothProfileManager profileManager, + @Nullable AmbientVolumeControlCallback callback) { + mProfileManager = profileManager; + mVolumeControlProfile = profileManager.getVolumeControlProfile(); + if (mVolumeControlProfile != null && !mVolumeControlProfile.isProfileReady()) { + mProfileManager.addServiceListener(this); + } + mCallback = callback; + } + + @Override + public void onServiceConnected() { + if (mVolumeControlProfile != null && mVolumeControlProfile.isProfileReady()) { + mProfileManager.removeServiceListener(this); + if (mCallback != null) { + mCallback.onVolumeControlServiceConnected(); + } + } + } + + @Override + public void onServiceDisconnected() { + // Do nothing + } + + /** + * Registers the same {@link AmbientCallback} on all ambient control points of the remote + * device. The {@link AmbientCallback} will pass the event to registered + * {@link AmbientVolumeControlCallback} if exists. + * + * @param executor the executor to run the callback + * @param device the remote device + */ + public void registerCallback(@NonNull Executor executor, @NonNull BluetoothDevice device) { + AmbientCallback ambientCallback = new AmbientCallback(device, mCallback); + synchronized (mDeviceCallbackMap) { + mDeviceCallbackMap.put(device, ambientCallback); + } + + // register callback on all ambient input control points of this device + List<AudioInputControl> controls = getAmbientControls(device); + controls.forEach((control) -> { + try { + control.registerCallback(executor, ambientCallback); + } catch (IllegalArgumentException e) { + // The callback was already registered + Log.i(TAG, "Skip registering the callback, " + e.getMessage()); + } + }); + } + + /** + * Unregisters the {@link AmbientCallback} on all ambient control points of the remote + * device which is previously registered with {@link #registerCallback}. + * + * @param device the remote device + */ + public void unregisterCallback(@NonNull BluetoothDevice device) { + AmbientCallback ambientCallback; + synchronized (mDeviceCallbackMap) { + ambientCallback = mDeviceCallbackMap.remove(device); + } + if (ambientCallback == null) { + // callback not found, no need to unregister + return; + } + + // unregister callback on all ambient input control points of this device + List<AudioInputControl> controls = getAmbientControls(device); + controls.forEach(control -> { + try { + control.unregisterCallback(ambientCallback); + } catch (IllegalArgumentException e) { + // The callback was never registered or was already unregistered + Log.i(TAG, "Skip unregistering the callback, " + e.getMessage()); + } + }); + } + + /** + * Gets the gain setting max value from first ambient control point of the remote device. + * + * @param device the remote device + */ + public int getAmbientMax(@NonNull BluetoothDevice device) { + List<AudioInputControl> ambientControls = getAmbientControls(device); + int value = INVALID_VOLUME; + if (!ambientControls.isEmpty()) { + value = ambientControls.getFirst().getGainSettingMax(); + } + return value; + } + + /** + * Gets the gain setting min value from first ambient control point of the remote device. + * + * @param device the remote device + */ + public int getAmbientMin(@NonNull BluetoothDevice device) { + List<AudioInputControl> ambientControls = getAmbientControls(device); + int value = INVALID_VOLUME; + if (!ambientControls.isEmpty()) { + value = ambientControls.getFirst().getGainSettingMin(); + } + return value; + } + + /** + * Gets the latest values in {@link RemoteAmbientState}. + * + * @param device the remote device + * @return the {@link RemoteAmbientState} represents current remote ambient control point state + */ + @Nullable + public RemoteAmbientState refreshAmbientState(@Nullable BluetoothDevice device) { + if (device == null || !device.isConnected()) { + return null; + } + int gainSetting = getAmbient(device); + int mute = getMute(device); + return new RemoteAmbientState(gainSetting, mute); + } + + /** + * Gets the gain setting value from first ambient control point of the remote device and + * stores it in cached {@link RemoteAmbientState}. + * + * When any audio input point receives {@link AmbientCallback#onGainSettingChanged(int)} + * callback, only the changed value which is different from the value stored in the cached + * state will be notified to the {@link AmbientVolumeControlCallback} of this controller. + * + * @param device the remote device + */ + public int getAmbient(@NonNull BluetoothDevice device) { + List<AudioInputControl> ambientControls = getAmbientControls(device); + int value = INVALID_VOLUME; + if (!ambientControls.isEmpty()) { + synchronized (mDeviceAmbientStateMap) { + value = ambientControls.getFirst().getGainSetting(); + RemoteAmbientState state = mDeviceAmbientStateMap.getOrDefault(device, + new RemoteAmbientState(INVALID_VOLUME, MUTE_DISABLED)); + RemoteAmbientState updatedState = new RemoteAmbientState(value, state.mute); + mDeviceAmbientStateMap.put(device, updatedState); + } + } + return value; + } + + /** + * Sets the gain setting value to all ambient control points of the remote device. + * + * @param device the remote device + * @param value the gain setting value to be updated + */ + public void setAmbient(@NonNull BluetoothDevice device, int value) { + if (DEBUG) { + Log.d(TAG, "setAmbient, value:" + value + ", device:" + device); + } + List<AudioInputControl> ambientControls = getAmbientControls(device); + ambientControls.forEach(control -> control.setGainSetting(value)); + } + + /** + * Gets the mute state from first ambient control point of the remote device and + * stores it in cached {@link RemoteAmbientState}. The value will be one of + * {@link AudioInputControl.Mute}. + * + * When any audio input point receives {@link AmbientCallback#onMuteChanged(int)} callback, + * only the changed value which is different from the value stored in the cached state will + * be notified to the {@link AmbientVolumeControlCallback} of this controller. + * + * @param device the remote device + */ + public int getMute(@NonNull BluetoothDevice device) { + List<AudioInputControl> ambientControls = getAmbientControls(device); + int value = MUTE_DISABLED; + if (!ambientControls.isEmpty()) { + synchronized (mDeviceAmbientStateMap) { + value = ambientControls.getFirst().getMute(); + RemoteAmbientState state = mDeviceAmbientStateMap.getOrDefault(device, + new RemoteAmbientState(INVALID_VOLUME, MUTE_DISABLED)); + RemoteAmbientState updatedState = new RemoteAmbientState(state.gainSetting, value); + mDeviceAmbientStateMap.put(device, updatedState); + } + } + return value; + } + + /** + * Sets the mute state to all ambient control points of the remote device. + * + * @param device the remote device + * @param muted the mute state to be updated + */ + public void setMuted(@NonNull BluetoothDevice device, boolean muted) { + if (DEBUG) { + Log.d(TAG, "setMuted, muted:" + muted + ", device:" + device); + } + List<AudioInputControl> ambientControls = getAmbientControls(device); + ambientControls.forEach(control -> { + try { + control.setMute(muted ? MUTE_MUTED : MUTE_NOT_MUTED); + } catch (IllegalStateException e) { + // Sometimes remote will throw this exception due to initialization not done + // yet. Catch it to prevent crashes on UI. + Log.w(TAG, "Remote mute state is currently disabled."); + } + }); + } + + /** + * Checks if there's any valid ambient control point exists on the remote device + * + * @param device the remote device + */ + public boolean isAmbientControlAvailable(@NonNull BluetoothDevice device) { + final boolean hasAmbientControlPoint = !getAmbientControls(device).isEmpty(); + final boolean connectedToVcp = mVolumeControlProfile.getConnectionStatus(device) + == BluetoothProfile.STATE_CONNECTED; + return hasAmbientControlPoint && connectedToVcp; + } + + @NonNull + private List<AudioInputControl> getAmbientControls(@NonNull BluetoothDevice device) { + if (mVolumeControlProfile == null) { + return Collections.emptyList(); + } + synchronized (mDeviceAmbientControlsMap) { + if (mDeviceAmbientControlsMap.containsKey(device)) { + return mDeviceAmbientControlsMap.get(device); + } + List<AudioInputControl> ambientControls = + mVolumeControlProfile.getAudioInputControlServices(device).stream().filter( + this::isValidAmbientControl).toList(); + if (!ambientControls.isEmpty()) { + mDeviceAmbientControlsMap.put(device, ambientControls); + } + return ambientControls; + } + } + + private boolean isValidAmbientControl(AudioInputControl control) { + boolean isAmbientControl = + control.getAudioInputType() == AudioInputControl.AUDIO_INPUT_TYPE_AMBIENT; + boolean isManual = control.getGainMode() == AudioInputControl.GAIN_MODE_MANUAL + || control.getGainMode() == AudioInputControl.GAIN_MODE_MANUAL_ONLY; + boolean isActive = + control.getAudioInputStatus() == AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE; + + return isAmbientControl && isManual && isActive; + } + + /** + * Callback providing information about the status and received events of + * {@link AmbientVolumeController}. + */ + public interface AmbientVolumeControlCallback { + + /** This method is called when the Volume Control Service is connected */ + default void onVolumeControlServiceConnected() { + } + + /** + * This method is called when one of the remote device's ambient control point's gain + * settings value is changed. + * + * @param device the remote device + * @param gainSettings the new gain setting value + */ + default void onAmbientChanged(@NonNull BluetoothDevice device, int gainSettings) { + } + + /** + * This method is called when one of the remote device's ambient control point's mute + * state is changed. + * + * @param device the remote device + * @param mute the new mute state + */ + default void onMuteChanged(@NonNull BluetoothDevice device, int mute) { + } + + /** + * This method is called when any command to the remote device's ambient control point + * is failed. + * + * @param device the remote device. + */ + default void onCommandFailed(@NonNull BluetoothDevice device) { + } + } + + /** + * A wrapper callback that will pass {@link AudioInputControl.AudioInputCallback} with extra + * device information to {@link AmbientVolumeControlCallback}. + */ + class AmbientCallback implements AudioInputControl.AudioInputCallback { + + private final BluetoothDevice mDevice; + private final AmbientVolumeControlCallback mCallback; + + AmbientCallback(@NonNull BluetoothDevice device, + @Nullable AmbientVolumeControlCallback callback) { + mDevice = device; + mCallback = callback; + } + + @Override + public void onGainSettingChanged(int gainSetting) { + if (mCallback != null) { + synchronized (mDeviceAmbientStateMap) { + RemoteAmbientState previousState = mDeviceAmbientStateMap.get(mDevice); + if (previousState.gainSetting != gainSetting) { + mCallback.onAmbientChanged(mDevice, gainSetting); + } + } + } + } + + @Override + public void onSetGainSettingFailed() { + Log.w(TAG, "onSetGainSettingFailed, device=" + mDevice); + if (mCallback != null) { + mCallback.onCommandFailed(mDevice); + } + } + + @Override + public void onMuteChanged(int mute) { + if (mCallback != null) { + synchronized (mDeviceAmbientStateMap) { + RemoteAmbientState previousState = mDeviceAmbientStateMap.get(mDevice); + if (previousState.mute != mute) { + mCallback.onMuteChanged(mDevice, mute); + } + } + } + } + + @Override + public void onSetMuteFailed() { + Log.w(TAG, "onSetMuteFailed, device=" + mDevice); + if (mCallback != null) { + mCallback.onCommandFailed(mDevice); + } + } + } + + public record RemoteAmbientState(int gainSetting, int mute) { + public boolean isMutable() { + return mute != MUTE_DISABLED; + } + public boolean isMuted() { + return mute == MUTE_MUTED; + } + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index b58983ff1ce8..b4afb7d8cd4c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -1591,6 +1591,12 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> private int getHearingDeviceSummaryRes(int leftBattery, int rightBattery, boolean shortSummary) { + if (getDeviceSide() == HearingAidInfo.DeviceSide.SIDE_MONO + || getDeviceSide() == HearingAidInfo.DeviceSide.SIDE_LEFT_AND_RIGHT) { + return !shortSummary && (getBatteryLevel() > BluetoothDevice.BATTERY_LEVEL_UNKNOWN) + ? R.string.bluetooth_active_battery_level + : R.string.bluetooth_active_no_battery_level; + } boolean isLeftDeviceConnected = getConnectedHearingAidSide( HearingAidInfo.DeviceSide.SIDE_LEFT).isPresent(); boolean isRightDeviceConnected = getConnectedHearingAidSide( @@ -1646,8 +1652,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> @HearingAidInfo.DeviceSide int side) { return Stream.concat(Stream.of(this, mSubDevice), mMemberDevices.stream()) .filter(Objects::nonNull) - .filter(device -> device.getDeviceSide() == side - || device.getDeviceSide() == HearingAidInfo.DeviceSide.SIDE_LEFT_AND_RIGHT) + .filter(device -> device.getDeviceSide() == side) .filter(device -> device.getDevice().isConnected()) // For hearing aids, we should expect only one device assign to one side, but if // it happens, we don't care which one. @@ -1911,6 +1916,25 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> BluetoothProfile.STATE_CONNECTED; } + /** + * @return {@code true} if {@code cachedBluetoothDevice} supports broadcast assistant profile + */ + public boolean isConnectedLeAudioBroadcastAssistantDevice() { + LocalBluetoothLeBroadcastAssistant leBroadcastAssistant = + mProfileManager.getLeAudioBroadcastAssistantProfile(); + return leBroadcastAssistant != null && leBroadcastAssistant.getConnectionStatus(mDevice) + == BluetoothProfile.STATE_CONNECTED; + } + + /** + * @return {@code true} if {@code cachedBluetoothDevice} supports volume control profile + */ + public boolean isConnectedVolumeControlDevice() { + VolumeControlProfile volumeControl = mProfileManager.getVolumeControlProfile(); + return volumeControl != null && volumeControl.getConnectionStatus(mDevice) + == BluetoothProfile.STATE_CONNECTED; + } + private boolean isConnectedSapDevice() { SapProfile sapProfile = mProfileManager.getSapProfile(); return sapProfile != null && sapProfile.getConnectionStatus(mDevice) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index 7fdb32cb63e9..b754706fb9a1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -153,7 +153,7 @@ public class CachedBluetoothDeviceManager { /** * Returns device summary of the pair of the hearing aid / CSIP passed as the parameter. * - * @param CachedBluetoothDevice device + * @param device the remote device * @return Device summary, or if the pair does not exist or if it is not a hearing aid or * a CSIP set member, then {@code null}. */ @@ -394,6 +394,7 @@ public class CachedBluetoothDeviceManager { } public synchronized void onDeviceUnpaired(CachedBluetoothDevice device) { + mHearingAidDeviceManager.clearLocalDataIfNeeded(device); device.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID); CachedBluetoothDevice mainDevice = mCsipDeviceManager.findMainDevice(device); // Should iterate through the cloned set to avoid ConcurrentModificationException diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java index fa28cf6c8a76..1ca4c2b39a70 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java @@ -18,7 +18,6 @@ package com.android.settingslib.bluetooth; import android.bluetooth.BluetoothCsipSetCoordinator; import android.bluetooth.BluetoothHapClient; import android.bluetooth.BluetoothHearingAid; -import android.bluetooth.BluetoothLeAudio; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothUuid; import android.bluetooth.le.ScanFilter; @@ -308,6 +307,10 @@ public class HearingAidDeviceManager { } } + void clearLocalDataIfNeeded(CachedBluetoothDevice device) { + HearingDeviceLocalDataManager.clear(mContext, device.getDevice()); + } + private void setAudioRoutingConfig(CachedBluetoothDevice device) { AudioDeviceAttributes hearingDeviceAttributes = mRoutingHelper.getMatchedHearingDeviceAttributes(device); @@ -428,8 +431,7 @@ public class HearingAidDeviceManager { p -> p instanceof HapClientProfile)) { int audioLocation = leAudioProfile.getAudioLocation(cachedDevice.getDevice()); int hearingAidType = hapClientProfile.getHearingAidType(cachedDevice.getDevice()); - if (audioLocation != BluetoothLeAudio.AUDIO_LOCATION_INVALID - && hearingAidType != HapClientProfile.HearingAidType.TYPE_INVALID) { + if (hearingAidType != HapClientProfile.HearingAidType.TYPE_INVALID) { final HearingAidInfo info = new HearingAidInfo.Builder() .setLeAudioLocation(audioLocation) .setHapDeviceType(hearingAidType) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java index ef08c924b844..8399824f11e9 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java @@ -34,6 +34,7 @@ public class HearingAidInfo { DeviceSide.SIDE_LEFT, DeviceSide.SIDE_RIGHT, DeviceSide.SIDE_LEFT_AND_RIGHT, + DeviceSide.SIDE_MONO }) /** Side definition for hearing aids. */ @@ -42,6 +43,7 @@ public class HearingAidInfo { int SIDE_LEFT = 0; int SIDE_RIGHT = 1; int SIDE_LEFT_AND_RIGHT = 2; + int SIDE_MONO = 3; } @Retention(java.lang.annotation.RetentionPolicy.SOURCE) @@ -124,6 +126,9 @@ public class HearingAidInfo { @DeviceSide private static int convertLeAudioLocationToInternalSide(int leAudioLocation) { + if (leAudioLocation == BluetoothLeAudio.AUDIO_LOCATION_MONO) { + return DeviceSide.SIDE_MONO; + } boolean isLeft = (leAudioLocation & LE_AUDIO_LOCATION_LEFT) != 0; boolean isRight = (leAudioLocation & LE_AUDIO_LOCATION_RIGHT) != 0; if (isLeft && isRight) { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java index 7a64965334c9..6725558cd2bd 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java @@ -86,6 +86,17 @@ public class HearingDeviceLocalDataManager { mSettingsObserver = new SettingsObserver(ThreadUtils.getUiThreadHandler()); } + /** + * Clears the local data of the device. This method should be called when the device is + * unpaired. + */ + public static void clear(@NonNull Context context, @NonNull BluetoothDevice device) { + HearingDeviceLocalDataManager manager = new HearingDeviceLocalDataManager(context); + manager.getLocalDataFromSettings(); + manager.remove(device); + manager.putAmbientVolumeSettings(); + } + /** Starts the manager. Loads the data from Settings and start observing any changes. */ public synchronized void start() { if (mIsStarted) { @@ -141,6 +152,7 @@ public class HearingDeviceLocalDataManager { * Puts the local data of the corresponding hearing device. * * @param device the device to update the local data + * @param data the local data to be stored */ private void put(BluetoothDevice device, Data data) { if (device == null) { @@ -148,7 +160,11 @@ public class HearingDeviceLocalDataManager { } synchronized (sLock) { final String addr = device.getAnonymizedAddress(); - mAddrToDataMap.put(addr, data); + if (data == null) { + mAddrToDataMap.remove(addr); + } else { + mAddrToDataMap.put(addr, data); + } if (mListener != null && mListenerExecutor != null) { mListenerExecutor.execute(() -> mListener.onDeviceLocalDataChange(addr, data)); } @@ -156,6 +172,24 @@ public class HearingDeviceLocalDataManager { } /** + * Removes the local data of the corresponding hearing device. + * + * @param device the device to remove the local data + */ + private void remove(BluetoothDevice device) { + if (device == null) { + return; + } + synchronized (sLock) { + final String addr = device.getAnonymizedAddress(); + mAddrToDataMap.remove(addr); + if (mListener != null && mListenerExecutor != null) { + mListenerExecutor.execute(() -> mListener.onDeviceLocalDataChange(addr, null)); + } + } + } + + /** * Updates the ambient volume of the corresponding hearing device. This should be called after * {@link #start()} is called(). * diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java index a4c5a00dc53e..5bcdcc09206b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java @@ -32,7 +32,9 @@ import android.content.Context; import android.os.Build; import android.util.Log; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.android.settingslib.R; @@ -372,6 +374,27 @@ public class LocalBluetoothLeBroadcastAssistant implements LocalBluetoothProfile } /** + * Gets the {@link BluetoothLeBroadcastMetadata} of a specified source added to this sink. + * + * @param sink Broadcast Sink device + * @param sourceId Broadcast source id + * @return metadata {@link BluetoothLeBroadcastMetadata} associated with the specified source. + */ + public @Nullable BluetoothLeBroadcastMetadata getSourceMetadata( + @NonNull BluetoothDevice sink, @IntRange(from = 0x00, to = 0xFF) int sourceId) { + if (mService == null) { + Log.d(TAG, "The BluetoothLeBroadcastAssistant is null"); + return null; + } + try { + return mService.getSourceMetadata(sink, sourceId); + } catch (IllegalArgumentException | NoSuchMethodError e) { + Log.w(TAG, "Error calling getSourceMetadata()", e); + } + return null; + } + + /** * Register Broadcast Assistant Callbacks to track its state and receivers * * @param executor Executor object for callback diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt index a7e04640d069..e01f27964733 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt @@ -27,6 +27,7 @@ import android.net.wifi.WifiManager import android.net.wifi.sharedconnectivity.app.NetworkProviderInfo import android.os.Bundle import android.os.SystemClock +import android.security.advancedprotection.AdvancedProtectionManager import android.util.Log import android.view.WindowManager import androidx.annotation.VisibleForTesting @@ -498,7 +499,13 @@ open class WifiUtils { ): Job = coroutineScope.launch { val wifiManager = context.getSystemService(WifiManager::class.java) ?: return@launch - if (wifiManager.isWepSupported == true && wifiManager.queryWepAllowed()) { + val aapmManager = context.getSystemService(AdvancedProtectionManager::class.java) + if (isAdvancedProtectionEnabled(aapmManager)) { + val intent = aapmManager.createSupportIntent( + AdvancedProtectionManager.FEATURE_ID_DISALLOW_WEP, + AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION) + onStartActivity(intent) + } else if (wifiManager.isWepSupported == true && wifiManager.queryWepAllowed()) { onAllowed() } else { val intent = Intent(Intent.ACTION_MAIN).apply { @@ -522,6 +529,18 @@ open class WifiUtils { } } + private suspend fun isAdvancedProtectionEnabled( + aapmManager: AdvancedProtectionManager? + ): Boolean = + if (android.security.Flags.aapmApi() && + com.android.wifi.flags.Flags.wepDisabledInApm() && + aapmManager != null + ) { + withContext(Dispatchers.Default) { aapmManager.isAdvancedProtectionEnabled() } + } else { + false + } + const val SSID = "ssid" const val DIALOG_WINDOW_TYPE = "dialog_window_type" } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java index a03977c16f66..785bcbf5a91c 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java @@ -21,15 +21,26 @@ import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NO import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT; import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_REMOTE_INPUT; import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS; +import static android.security.advancedprotection.AdvancedProtectionManager.ADVANCED_PROTECTION_SYSTEM_ENTITY; + import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.admin.Authority; +import android.app.admin.DeviceAdminAuthority; import android.app.admin.DevicePolicyManager; +import android.app.admin.DpcAuthority; +import android.app.admin.EnforcingAdmin; +import android.app.admin.RoleAuthority; +import android.app.admin.UnknownAuthority; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -37,8 +48,13 @@ import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; +import android.platform.test.annotations.RequiresFlagsDisabled; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; @@ -52,6 +68,8 @@ import java.util.Collections; @RunWith(RobolectricTestRunner.class) public class RestrictedLockUtilsTest { + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Mock private Context mContext; @@ -66,6 +84,7 @@ public class RestrictedLockUtilsTest { private final int mUserId = 194; private final int mProfileId = 160; + private final String mPackage = "test.pkg"; private final ComponentName mAdmin1 = new ComponentName("admin1", "admin1class"); private final ComponentName mAdmin2 = new ComponentName("admin2", "admin2class"); @@ -85,6 +104,7 @@ public class RestrictedLockUtilsTest { RestrictedLockUtilsInternal.sProxy = mProxy; } + @RequiresFlagsDisabled(android.security.Flags.FLAG_AAPM_API) @Test public void checkIfRestrictionEnforced_deviceOwner() throws PackageManager.NameNotFoundException { @@ -109,6 +129,7 @@ public class RestrictedLockUtilsTest { assertThat(enforcedAdmin.component).isEqualTo(mAdmin1); } + @RequiresFlagsDisabled(android.security.Flags.FLAG_AAPM_API) @Test public void checkIfRestrictionEnforced_profileOwner() throws PackageManager.NameNotFoundException { @@ -133,6 +154,125 @@ public class RestrictedLockUtilsTest { assertThat(enforcedAdmin.component).isEqualTo(mAdmin1); } + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void checkIfRestrictionEnforced_getEnforcingAdminExists() { + UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId, + UserManager.RESTRICTION_SOURCE_PROFILE_OWNER); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + final EnforcingAdmin enforcingAdmin = new EnforcingAdmin(mPackage, + UnknownAuthority.UNKNOWN_AUTHORITY, UserHandle.of(mUserId), mAdmin1); + + when(mUserManager.getUserRestrictionSources(userRestriction, + UserHandle.of(mUserId))) + .thenReturn(Collections.singletonList(enforcingUser)); + when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction)) + .thenReturn(enforcingAdmin); + + EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced( + mContext, userRestriction, mUserId); + + assertThat(enforcedAdmin).isNotNull(); + assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction); + assertThat(enforcedAdmin.component).isEqualTo(enforcingAdmin.getComponentName()); + assertThat(enforcedAdmin.user).isEqualTo(enforcingAdmin.getUserHandle()); + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void checkIfRestrictionEnforced_getEnforcingAdminReturnsNull_deviceOwner() + throws PackageManager.NameNotFoundException { + UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId, + UserManager.RESTRICTION_SOURCE_DEVICE_OWNER); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + + when(mUserManager.getUserRestrictionSources(userRestriction, + UserHandle.of(mUserId))) + .thenReturn(Collections.singletonList(enforcingUser)); + when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction)) + .thenReturn(null); + when(mContext.createPackageContextAsUser(any(), eq(0), + eq(UserHandle.of(mUserId)))) + .thenReturn(mContext); + + setUpDeviceOwner(mAdmin1, mUserId); + + EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal + .checkIfRestrictionEnforced(mContext, userRestriction, mUserId); + + assertThat(enforcedAdmin).isNotNull(); + assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction); + assertThat(enforcedAdmin.component).isEqualTo(mAdmin1); + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void checkIfRestrictionEnforced_getEnforcingAdminReturnsNull_profileOwner() + throws PackageManager.NameNotFoundException { + UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId, + UserManager.RESTRICTION_SOURCE_PROFILE_OWNER); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + + when(mUserManager.getUserRestrictionSources(userRestriction, + UserHandle.of(mUserId))) + .thenReturn(Collections.singletonList(enforcingUser)); + when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction)) + .thenReturn(null); + when(mContext.createPackageContextAsUser(any(), eq(0), + eq(UserHandle.of(mUserId)))) + .thenReturn(mContext); + + setUpProfileOwner(mAdmin1); + + EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal + .checkIfRestrictionEnforced(mContext, userRestriction, mUserId); + + assertThat(enforcedAdmin).isNotNull(); + assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction); + assertThat(enforcedAdmin.component).isEqualTo(mAdmin1); + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void isPolicyEnforcedByAdvancedProtection_notEnforced_returnsFalse() { + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + final Authority[] allNonAdvancedProtectionAuthorities = new Authority[] { + UnknownAuthority.UNKNOWN_AUTHORITY, + DeviceAdminAuthority.DEVICE_ADMIN_AUTHORITY, + DpcAuthority.DPC_AUTHORITY, + new RoleAuthority(Collections.singleton("some-role")) + }; + + for (Authority authority : allNonAdvancedProtectionAuthorities) { + final EnforcingAdmin enforcingAdmin = new EnforcingAdmin(mPackage, authority, + UserHandle.of(mUserId), mAdmin1); + + when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction)) + .thenReturn(enforcingAdmin); + + assertWithMessage(authority + " is not an advanced protection authority") + .that(RestrictedLockUtilsInternal.isPolicyEnforcedByAdvancedProtection( + mContext, userRestriction, mUserId)) + .isFalse(); + } + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void isPolicyEnforcedByAdvancedProtection_enforced_returnsTrue() { + final Authority advancedProtectionAuthority = new UnknownAuthority( + ADVANCED_PROTECTION_SYSTEM_ENTITY); + final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage, + advancedProtectionAuthority, UserHandle.of(mUserId), mAdmin1); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + + when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction)) + .thenReturn(advancedProtectionEnforcingAdmin); + + assertThat(RestrictedLockUtilsInternal.isPolicyEnforcedByAdvancedProtection(mContext, + userRestriction, mUserId)).isTrue(); + } + @Test public void checkIfDevicePolicyServiceDisabled_noEnforceAdminForManagedProfile() { when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(null); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java index 7ad54e187ae5..dbbbd5bf8089 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java @@ -16,7 +16,10 @@ package com.android.settingslib; +import static android.security.advancedprotection.AdvancedProtectionManager.ADVANCED_PROTECTION_SYSTEM_ENTITY; + import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; @@ -26,10 +29,23 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.admin.Authority; +import android.app.admin.DeviceAdminAuthority; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyResourcesManager; +import android.app.admin.DpcAuthority; +import android.app.admin.EnforcingAdmin; +import android.app.admin.RoleAuthority; +import android.app.admin.UnknownAuthority; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.os.UserHandle; +import android.os.UserManager; +import android.platform.test.annotations.RequiresFlagsDisabled; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.view.View; import android.widget.TextView; @@ -37,14 +53,19 @@ import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; +import java.util.Collections; + @RunWith(RobolectricTestRunner.class) public class RestrictedPreferenceHelperTest { + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Mock private Context mContext; @@ -57,6 +78,11 @@ public class RestrictedPreferenceHelperTest { @Mock private RestrictedTopLevelPreference mRestrictedTopLevelPreference; + private final String mPackage = "test.pkg"; + private final ComponentName mAdmin = new ComponentName("admin", "adminclass"); + private final Authority mAdvancedProtectionAuthority = new UnknownAuthority( + ADVANCED_PROTECTION_SYSTEM_ENTITY); + private PreferenceViewHolder mViewHolder; private RestrictedPreferenceHelper mHelper; @@ -71,6 +97,7 @@ public class RestrictedPreferenceHelperTest { mHelper = new RestrictedPreferenceHelper(mContext, mPreference, null); } + @RequiresFlagsDisabled(android.security.Flags.FLAG_AAPM_API) @Test public void bindPreference_disabled_shouldDisplayDisabledSummary() { final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS); @@ -101,6 +128,57 @@ public class RestrictedPreferenceHelperTest { verify(summaryView, never()).setVisibility(View.GONE); } + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void bindPreference_disabled_byAdvancedProtection_shouldDisplayDisabledSummary() { + final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + final RestrictedLockUtils.EnforcedAdmin enforcedAdmin = new RestrictedLockUtils + .EnforcedAdmin(/* component */ null, userRestriction, UserHandle.of( + UserHandle.myUserId())); + final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage, + mAdvancedProtectionAuthority, UserHandle.of(UserHandle.myUserId()), mAdmin); + + when(mViewHolder.itemView.findViewById(android.R.id.summary)) + .thenReturn(summaryView); + when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction)) + .thenReturn(advancedProtectionEnforcingAdmin); + when(mContext.getString( + com.android.settingslib.widget.restricted.R.string.disabled_by_advanced_protection)) + .thenReturn("advanced_protection"); + + mHelper.useAdminDisabledSummary(true); + mHelper.setDisabledByAdmin(enforcedAdmin); + mHelper.onBindViewHolder(mViewHolder); + + verify(summaryView).setText("advanced_protection"); + verify(summaryView, never()).setVisibility(View.GONE); + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void bindPreference_disabled_byAdmin_shouldDisplayDisabledSummary() { + final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS); + final EnforcingAdmin nonAdvancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage, + UnknownAuthority.UNKNOWN_AUTHORITY, UserHandle.of(UserHandle.myUserId()), mAdmin); + final String userRestriction = UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY; + + when(mViewHolder.itemView.findViewById(android.R.id.summary)) + .thenReturn(summaryView); + when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction)) + .thenReturn(nonAdvancedProtectionEnforcingAdmin); + when(mContext.getString(R.string.disabled_by_admin_summary_text)) + .thenReturn("test"); + when(mDevicePolicyResourcesManager.getString(any(), any())).thenReturn("test"); + + mHelper.useAdminDisabledSummary(true); + mHelper.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin()); + mHelper.onBindViewHolder(mViewHolder); + + verify(summaryView).setText("test"); + verify(summaryView, never()).setVisibility(View.GONE); + } + @Test public void bindPreference_notDisabled_shouldNotHideSummary() { final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS); @@ -157,4 +235,74 @@ public class RestrictedPreferenceHelperTest { assertThat(mHelper.isDisabledByAdmin()).isTrue(); } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void setDisabledByAdmin_previousAndCurrentAdminsAreTheSame_returnsFalse() { + RestrictedLockUtils.EnforcedAdmin enforcedAdmin = + new RestrictedLockUtils.EnforcedAdmin(/* component */ null, + /* enforcedRestriction */ "some_restriction", /* userHandle */ null); + + mHelper.setDisabledByAdmin(enforcedAdmin); + + assertThat(mHelper.setDisabledByAdmin(enforcedAdmin)).isFalse(); + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void setDisabledByAdmin_previousAndCurrentAdminsAreDifferent_returnsTrue() { + RestrictedLockUtils.EnforcedAdmin enforcedAdmin1 = + new RestrictedLockUtils.EnforcedAdmin(/* component */ null, + /* enforcedRestriction */ "some_restriction", /* userHandle */ null); + RestrictedLockUtils.EnforcedAdmin enforcedAdmin2 = + new RestrictedLockUtils.EnforcedAdmin(new ComponentName("pkg", "cls"), + /* enforcedRestriction */ "some_restriction", /* userHandle */ null); + + mHelper.setDisabledByAdmin(enforcedAdmin1); + + assertThat(mHelper.setDisabledByAdmin(enforcedAdmin2)).isTrue(); + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void isRestrictionEnforcedByAdvancedProtection_notEnforced_returnsFalse() { + final Authority[] allNonAdvancedProtectionAuthorities = new Authority[] { + UnknownAuthority.UNKNOWN_AUTHORITY, + DeviceAdminAuthority.DEVICE_ADMIN_AUTHORITY, + DpcAuthority.DPC_AUTHORITY, + new RoleAuthority(Collections.singleton("some-role")) + }; + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + + for (Authority authority : allNonAdvancedProtectionAuthorities) { + final EnforcingAdmin enforcingAdmin = new EnforcingAdmin(mPackage, authority, + UserHandle.of(UserHandle.myUserId()), mAdmin); + + when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction)) + .thenReturn(enforcingAdmin); + + mHelper.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin(/* component */ null, + userRestriction, UserHandle.of(UserHandle.myUserId()))); + + assertWithMessage(authority + " is not an advanced protection authority") + .that(mHelper.isRestrictionEnforcedByAdvancedProtection()) + .isFalse(); + } + } + + @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API) + @Test + public void isRestrictionEnforcedByAdvancedProtection_enforced_returnsTrue() { + final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage, + mAdvancedProtectionAuthority, UserHandle.of(UserHandle.myUserId()), mAdmin); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + + when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction)) + .thenReturn(advancedProtectionEnforcingAdmin); + + mHelper.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin(/* component */ null, + userRestriction, UserHandle.of(UserHandle.myUserId()))); + + assertThat(mHelper.isRestrictionEnforcedByAdvancedProtection()).isTrue(); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java new file mode 100644 index 000000000000..abc1d226972b --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java @@ -0,0 +1,318 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.bluetooth; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.bluetooth.AudioInputControl; +import android.bluetooth.BluetoothDevice; +import android.content.Context; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executor; + +/** Tests for {@link AmbientVolumeController}. */ +@RunWith(RobolectricTestRunner.class) +public class AmbientVolumeControllerTest { + + @Rule + public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + private static final String TEST_ADDRESS = "00:00:00:00:11"; + + @Mock + private LocalBluetoothProfileManager mProfileManager; + @Mock + private VolumeControlProfile mVolumeControlProfile; + @Mock + private AmbientVolumeController.AmbientVolumeControlCallback mCallback; + @Mock + private BluetoothDevice mDevice; + + private final Context mContext = ApplicationProvider.getApplicationContext(); + private AmbientVolumeController mVolumeController; + + @Before + public void setUp() { + when(mProfileManager.getVolumeControlProfile()).thenReturn(mVolumeControlProfile); + when(mDevice.getAddress()).thenReturn(TEST_ADDRESS); + when(mDevice.isConnected()).thenReturn(true); + mVolumeController = new AmbientVolumeController(mProfileManager, mCallback); + } + + @Test + public void onServiceConnected_notifyCallback() { + when(mVolumeControlProfile.isProfileReady()).thenReturn(true); + + mVolumeController.onServiceConnected(); + + verify(mCallback).onVolumeControlServiceConnected(); + } + + @Test + public void isAmbientControlAvailable_validControls_assertTrue() { + prepareValidAmbientControls(); + + assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isTrue(); + } + + @Test + public void isAmbientControlAvailable_streamingControls_assertFalse() { + prepareStreamingControls(); + + assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isFalse(); + } + + @Test + public void isAmbientControlAvailable_automaticAmbientControls_assertFalse() { + prepareAutomaticAmbientControls(); + + assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isFalse(); + } + + @Test + public void isAmbientControlAvailable_inactiveAmbientControls_assertFalse() { + prepareInactiveAmbientControls(); + + assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isFalse(); + } + + @Test + public void registerCallback_verifyRegisterOnAllControls() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.registerCallback(mContext.getMainExecutor(), mDevice); + + for (AudioInputControl control : controls) { + verify(control).registerCallback(any(Executor.class), any()); + } + } + + @Test + public void unregisterCallback_verifyUnregisterOnAllControls() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.registerCallback(mContext.getMainExecutor(), mDevice); + mVolumeController.unregisterCallback(mDevice); + + for (AudioInputControl control : controls) { + verify(control).unregisterCallback(any()); + } + } + + @Test + public void getAmbientMax_verifyGetOnFirstControl() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.getAmbientMax(mDevice); + + verify(controls.getFirst()).getGainSettingMax(); + } + + @Test + public void getAmbientMin_verifyGetOnFirstControl() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.getAmbientMin(mDevice); + + verify(controls.getFirst()).getGainSettingMin(); + } + + @Test + public void getAmbient_verifyGetOnFirstControl() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.getAmbient(mDevice); + + verify(controls.getFirst()).getGainSetting(); + } + + @Test + public void setAmbient_verifySetOnAllControls() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.setAmbient(mDevice, 10); + + for (AudioInputControl control : controls) { + verify(control).setGainSetting(10); + } + } + + @Test + public void getMute_verifyGetOnFirstControl() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.getMute(mDevice); + + verify(controls.getFirst()).getMute(); + } + + @Test + public void setMuted_true_verifySetOnAllControls() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.setMuted(mDevice, true); + + for (AudioInputControl control : controls) { + verify(control).setMute(AudioInputControl.MUTE_MUTED); + } + } + + @Test + public void setMuted_false_verifySetOnAllControls() { + List<AudioInputControl> controls = prepareValidAmbientControls(); + + mVolumeController.setMuted(mDevice, false); + + for (AudioInputControl control : controls) { + verify(control).setMute(AudioInputControl.MUTE_NOT_MUTED); + } + } + + @Test + public void ambientCallback_onGainSettingChanged_verifyCallbackIsCalledWhenStateChange() { + AmbientVolumeController.AmbientCallback ambientCallback = + mVolumeController.new AmbientCallback(mDevice, mCallback); + final int testAmbient = 10; + List<AudioInputControl> controls = prepareValidAmbientControls(); + when(controls.getFirst().getGainSetting()).thenReturn(testAmbient); + + mVolumeController.refreshAmbientState(mDevice); + ambientCallback.onGainSettingChanged(testAmbient); + verify(mCallback, never()).onAmbientChanged(mDevice, testAmbient); + + final int updatedTestAmbient = 20; + ambientCallback.onGainSettingChanged(updatedTestAmbient); + verify(mCallback).onAmbientChanged(mDevice, updatedTestAmbient); + } + + + @Test + public void ambientCallback_onSetAmbientFailed_verifyCallbackIsCalled() { + AmbientVolumeController.AmbientCallback ambientCallback = + mVolumeController.new AmbientCallback(mDevice, mCallback); + + ambientCallback.onSetGainSettingFailed(); + + verify(mCallback).onCommandFailed(mDevice); + } + + @Test + public void ambientCallback_onMuteChanged_verifyCallbackIsCalledWhenStateChange() { + AmbientVolumeController.AmbientCallback ambientCallback = + mVolumeController.new AmbientCallback(mDevice, mCallback); + final int testMute = 0; + List<AudioInputControl> controls = prepareValidAmbientControls(); + when(controls.getFirst().getMute()).thenReturn(testMute); + + mVolumeController.refreshAmbientState(mDevice); + ambientCallback.onMuteChanged(testMute); + verify(mCallback, never()).onMuteChanged(mDevice, testMute); + + final int updatedTestMute = 1; + ambientCallback.onMuteChanged(updatedTestMute); + verify(mCallback).onMuteChanged(mDevice, updatedTestMute); + } + + @Test + public void ambientCallback_onSetMuteFailed_verifyCallbackIsCalled() { + AmbientVolumeController.AmbientCallback ambientCallback = + mVolumeController.new AmbientCallback(mDevice, mCallback); + + ambientCallback.onSetMuteFailed(); + + verify(mCallback).onCommandFailed(mDevice); + } + + private List<AudioInputControl> prepareValidAmbientControls() { + List<AudioInputControl> controls = new ArrayList<>(); + final int controlsCount = 2; + for (int i = 0; i < controlsCount; i++) { + controls.add(prepareAudioInputControl( + AudioInputControl.AUDIO_INPUT_TYPE_AMBIENT, + AudioInputControl.GAIN_MODE_MANUAL, + AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE)); + } + when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls); + return controls; + } + + private List<AudioInputControl> prepareStreamingControls() { + List<AudioInputControl> controls = new ArrayList<>(); + final int controlsCount = 2; + for (int i = 0; i < controlsCount; i++) { + controls.add(prepareAudioInputControl( + AudioInputControl.AUDIO_INPUT_TYPE_STREAMING, + AudioInputControl.GAIN_MODE_MANUAL, + AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE)); + } + when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls); + return controls; + } + + private List<AudioInputControl> prepareAutomaticAmbientControls() { + List<AudioInputControl> controls = new ArrayList<>(); + final int controlsCount = 2; + for (int i = 0; i < controlsCount; i++) { + controls.add(prepareAudioInputControl( + AudioInputControl.AUDIO_INPUT_TYPE_STREAMING, + AudioInputControl.GAIN_MODE_AUTOMATIC, + AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE)); + } + when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls); + return controls; + } + + private List<AudioInputControl> prepareInactiveAmbientControls() { + List<AudioInputControl> controls = new ArrayList<>(); + final int controlsCount = 2; + for (int i = 0; i < controlsCount; i++) { + controls.add(prepareAudioInputControl( + AudioInputControl.AUDIO_INPUT_TYPE_STREAMING, + AudioInputControl.GAIN_MODE_AUTOMATIC, + AudioInputControl.AUDIO_INPUT_STATUS_INACTIVE)); + } + when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls); + return controls; + } + + private AudioInputControl prepareAudioInputControl(int type, int mode, int status) { + AudioInputControl control = mock(AudioInputControl.class); + when(control.getAudioInputType()).thenReturn(type); + when(control.getGainMode()).thenReturn(mode); + when(control.getAudioInputStatus()).thenReturn(status); + return control; + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java index 8cc997414d70..05f471f62f1d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java @@ -139,6 +139,11 @@ public class CachedBluetoothDeviceManagerTest { mCachedDevice1 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice1)); mCachedDevice2 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice2)); mCachedDevice3 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice3)); + + mHearingAidDeviceManager = spy(new HearingAidDeviceManager(mContext, mLocalBluetoothManager, + mCachedDeviceManager.mCachedDevices)); + mCachedDeviceManager.mHearingAidDeviceManager = mHearingAidDeviceManager; + doNothing().when(mHearingAidDeviceManager).clearLocalDataIfNeeded(any()); } /** @@ -338,6 +343,8 @@ public class CachedBluetoothDeviceManagerTest { // Call onDeviceUnpaired for the one in mCachedDevices. mCachedDeviceManager.onDeviceUnpaired(cachedDevice2); + + verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice2); verify(mDevice1).removeBond(); } @@ -353,6 +360,8 @@ public class CachedBluetoothDeviceManagerTest { // Call onDeviceUnpaired for the one in mCachedDevices. mCachedDeviceManager.onDeviceUnpaired(cachedDevice1); + + verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice1); verify(mDevice2).removeBond(); } @@ -406,9 +415,6 @@ public class CachedBluetoothDeviceManagerTest { */ @Test public void updateHearingAidDevices_directToHearingAidDeviceManager() { - mHearingAidDeviceManager = spy(new HearingAidDeviceManager(mContext, mLocalBluetoothManager, - mCachedDeviceManager.mCachedDevices)); - mCachedDeviceManager.mHearingAidDeviceManager = mHearingAidDeviceManager; mCachedDeviceManager.updateHearingAidsDevices(); verify(mHearingAidDeviceManager).updateHearingAidsDevices(); @@ -535,6 +541,7 @@ public class CachedBluetoothDeviceManagerTest { // Call onDeviceUnpaired for the one in mCachedDevices. mCachedDeviceManager.onDeviceUnpaired(cachedDevice1); + verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice1); verify(mDevice2).removeBond(); assertThat(cachedDevice1.getGroupId()).isEqualTo( BluetoothCsipSetCoordinator.GROUP_ID_INVALID); @@ -559,6 +566,7 @@ public class CachedBluetoothDeviceManagerTest { // Call onDeviceUnpaired for the one in mCachedDevices. mCachedDeviceManager.onDeviceUnpaired(cachedDevice2); + verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice2); verify(mDevice1).removeBond(); assertThat(cachedDevice2.getGroupId()).isEqualTo( BluetoothCsipSetCoordinator.GROUP_ID_INVALID); @@ -611,10 +619,7 @@ public class CachedBluetoothDeviceManagerTest { @Test public void onActiveDeviceChanged_validHiSyncId_callExpectedFunction() { - mHearingAidDeviceManager = spy(new HearingAidDeviceManager(mContext, mLocalBluetoothManager, - mCachedDeviceManager.mCachedDevices)); doNothing().when(mHearingAidDeviceManager).onActiveDeviceChanged(any()); - mCachedDeviceManager.mHearingAidDeviceManager = mHearingAidDeviceManager; when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); cachedDevice1.setHearingAidInfo( diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java index bf927a1eb4cc..eb73eee90f0d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java @@ -17,7 +17,6 @@ package com.android.settingslib.bluetooth; import static android.bluetooth.BluetoothHearingAid.HI_SYNC_ID_INVALID; import static android.bluetooth.BluetoothLeAudio.AUDIO_LOCATION_FRONT_LEFT; -import static android.bluetooth.BluetoothLeAudio.AUDIO_LOCATION_INVALID; import static com.android.settingslib.bluetooth.HapClientProfile.HearingAidType.TYPE_BINAURAL; import static com.android.settingslib.bluetooth.HapClientProfile.HearingAidType.TYPE_INVALID; @@ -272,14 +271,14 @@ public class HearingAidDeviceManagerTest { * * Conditions: * 1) LeAudio hearing aid - * 2) Invalid audio location and device type + * 2) Invalid device type * Result: * Do not set hearing aid info to the device. */ @Test public void initHearingAidDeviceIfNeeded_leAudio_invalidInfo_notToSetHearingAidInfo() { when(mCachedDevice1.getProfiles()).thenReturn(List.of(mLeAudioProfile, mHapClientProfile)); - when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_INVALID); + when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_FRONT_LEFT); when(mHapClientProfile.getHearingAidType(mDevice1)).thenReturn(TYPE_INVALID); mHearingAidDeviceManager.initHearingAidDeviceIfNeeded(mCachedDevice1, null); @@ -506,14 +505,14 @@ public class HearingAidDeviceManagerTest { * * Conditions: * 1) LeAudio hearing aid - * 2) Invalid audio location and device type + * 2) Invalid device type * Result: * Do not set hearing aid info to the device. */ @Test public void updateHearingAidsDevices_leAudio_invalidInfo_notToSetHearingAidInfo() { when(mCachedDevice1.getProfiles()).thenReturn(List.of(mLeAudioProfile, mHapClientProfile)); - when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_INVALID); + when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_FRONT_LEFT); when(mHapClientProfile.getHearingAidType(mDevice1)).thenReturn(TYPE_INVALID); mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java index b659c02a2540..6d83588e0f6e 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java @@ -194,6 +194,19 @@ public class HearingDeviceLocalDataManagerTest { verify(mListener).onDeviceLocalDataChange(TEST_ADDRESS, newData); } + @Test + public void clear_dataIsRemoved() { + String settings = Settings.Global.getStringForUser(mContext.getContentResolver(), + Settings.Global.HEARING_DEVICE_LOCAL_AMBIENT_VOLUME, UserHandle.USER_SYSTEM); + assertThat(settings.contains(TEST_ADDRESS)).isTrue(); + + HearingDeviceLocalDataManager.clear(mContext, mDevice); + + settings = Settings.Global.getStringForUser(mContext.getContentResolver(), + Settings.Global.HEARING_DEVICE_LOCAL_AMBIENT_VOLUME, UserHandle.USER_SYSTEM); + assertThat(settings.contains(TEST_ADDRESS)).isFalse(); + } + private void prepareTestDataInSettings() { String data = generateSettingsString(TEST_ADDRESS, TEST_AMBIENT, TEST_GROUP_AMBIENT, TEST_AMBIENT_CONTROL_EXPANDED); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java index aca2c4ef2a49..91ac34ac8233 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java @@ -72,7 +72,6 @@ import java.util.regex.Pattern; public final class DeviceConfigService extends Binder { private static final List<String> sAconfigTextProtoFilesOnDevice = List.of( "/system/etc/aconfig_flags.pb", - "/system_ext/etc/aconfig_flags.pb", "/product/etc/aconfig_flags.pb", "/vendor/etc/aconfig_flags.pb"); @@ -133,12 +132,7 @@ public final class DeviceConfigService extends Binder { } pw.println("DeviceConfig provider: "); - try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(fd)) { - DeviceConfig.dump(pfd, pw, /* prefix= */ " ", args); - } catch (IOException e) { - pw.print("IOException creating ParcelFileDescriptor: "); - pw.println(e); - } + DeviceConfig.dump(pw, /* prefix= */ " ", args); } IContentProvider iprovider = mProvider.getIContentProvider(); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 7aed61533aac..5cd534e62ea9 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -171,7 +171,6 @@ final class SettingsState { private static final List<String> sAconfigTextProtoFilesOnDevice = List.of( "/system/etc/aconfig_flags.pb", - "/system_ext/etc/aconfig_flags.pb", "/product/etc/aconfig_flags.pb", "/vendor/etc/aconfig_flags.pb"); diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 65f487765c1e..fb4293a9b5ea 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -348,6 +348,7 @@ <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_COMPUTER" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING" /> + <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_GLASSES" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_SELF_MANAGED" /> diff --git a/packages/Shell/OWNERS b/packages/Shell/OWNERS index d4b5b86223ea..576afdc824f2 100644 --- a/packages/Shell/OWNERS +++ b/packages/Shell/OWNERS @@ -13,3 +13,7 @@ cbrubaker@google.com omakoto@google.com michaelwr@google.com ronish@google.com + +# Wear Bugreport Owners +ranamouawi@google.com +yashasvig@google.com diff --git a/packages/SimAppDialog/res/values-af/strings.xml b/packages/SimAppDialog/res/values-af/strings.xml index 143bc67d0794..7a2ed82f37eb 100644 --- a/packages/SimAppDialog/res/values-af/strings.xml +++ b/packages/SimAppDialog/res/values-af/strings.xml @@ -19,8 +19,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="8898068901680117589">"SIM-programdialoog"</string> <string name="install_carrier_app_title" msgid="334729104862562585">"Aktiveer mobiele diens"</string> - <string name="install_carrier_app_description" msgid="4014303558674923797">"Jy sal die <xliff:g id="ID_1">%1$s</xliff:g>-program moet installeer om jou nuwe SIM behoorlik te laat werk"</string> + <string name="install_carrier_app_description" msgid="4014303558674923797">"Jy sal die <xliff:g id="ID_1">%1$s</xliff:g>-app moet installeer om jou nuwe SIM behoorlik te laat werk"</string> <string name="install_carrier_app_description_default" msgid="7356830245205847840">"Jy sal die diensverskafferprogram moet installeer om jou nuwe SIM behoorlik te laat werk"</string> <string name="install_carrier_app_defer_action" msgid="2558576736886876209">"Nie nou nie"</string> - <string name="install_carrier_app_download_action" msgid="7859229305958538064">"Laai program af"</string> + <string name="install_carrier_app_download_action" msgid="7859229305958538064">"Laai app af"</string> </resources> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 11cb0703d353..31d5bfaccd5d 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -322,6 +322,9 @@ <!-- Query all packages on device on R+ --> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> + <!-- Query advanced protection state --> + <uses-permission android:name="android.permission.QUERY_ADVANCED_PROTECTION_MODE" /> + <queries> <intent> <action android:name="android.intent.action.CREATE_NOTE" /> diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index ee229158decc..777f6d35c1de 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -679,7 +679,7 @@ flag { flag { name: "volume_redesign" namespace: "systemui" - description: "Enables Volume BC25 visuals update" + description: "Enables Volume visuals update" bug: "368308908" } @@ -1325,7 +1325,7 @@ flag { name: "media_controls_ui_update" namespace: "systemui" description: "Enables media visuals update" - bug: "380053768" + bug: "379044958" } flag { @@ -1339,16 +1339,6 @@ flag { } flag { - name: "validate_keyboard_shortcut_helper_icon_uri" - namespace: "systemui" - description: "Adds a check that the caller can access the content URI of an icon in the shortcut helper." - bug: "331180422" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "glanceable_hub_allow_keyguard_when_dreaming" namespace: "systemui" description: "Allows users to exit dream to keyguard with glanceable hub enabled" @@ -1879,3 +1869,10 @@ flag { description: "Larger privacy indicators on large screen" bug: "381864715" } + +flag { + name: "glanceable_hub_direct_edit_mode" + namespace: "systemui" + description: "Invokes edit mode directly from long press in glanceable hub" + bug: "382531177" +} diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java index 0317d5f095a1..d0404ec02306 100644 --- a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java +++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java @@ -18,8 +18,11 @@ package com.android.systemui.animation; import android.annotation.Nullable; import android.graphics.Canvas; +import android.graphics.Outline; +import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.Rect; +import android.graphics.RectF; import android.os.Build; import android.util.Log; import android.view.Surface; @@ -44,6 +47,9 @@ import java.util.concurrent.Executor; public class ViewUIComponent implements UIComponent { private static final String TAG = "ViewUIComponent"; private static final boolean DEBUG = Build.IS_USERDEBUG || Log.isLoggable(TAG, Log.DEBUG); + private final Path mClippingPath = new Path(); + private final Outline mClippingOutline = new Outline(); + private final OnDrawListener mOnDrawListener = this::postDraw; private final View mView; @@ -182,6 +188,17 @@ public class ViewUIComponent implements UIComponent { canvas.scale( (float) renderBounds.width() / realBounds.width(), (float) renderBounds.height() / realBounds.height()); + + if (mView.getClipToOutline()) { + mView.getOutlineProvider().getOutline(mView, mClippingOutline); + mClippingPath.reset(); + RectF rect = new RectF(0, 0, mView.getWidth(), mView.getHeight()); + final float cornerRadius = mClippingOutline.getRadius(); + mClippingPath.addRoundRect(rect, cornerRadius, cornerRadius, Path.Direction.CW); + mClippingPath.close(); + canvas.clipPath(mClippingPath); + } + canvas.saveLayerAlpha(null, (int) (255 * mView.getAlpha())); mView.draw(canvas); canvas.restore(); diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt index 92b6fd44e2f2..2a27a3033cf9 100644 --- a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt +++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt @@ -59,9 +59,9 @@ class ShadeDisplayAwareDetector : Detector(), SourceCodeScanner { private const val INJECT_ANNOTATION = "javax.inject.Inject" private const val APPLICATION_ANNOTATION = "com.android.systemui.dagger.qualifiers.Application" - private const val GLOBAL_CONFIG_ANNOTATION = "com.android.systemui.common.ui.GlobalConfig" private const val SHADE_DISPLAY_AWARE_ANNOTATION = "com.android.systemui.shade.ShadeDisplayAware" + private const val MAIN_ANNOTATION = "com.android.systemui.dagger.qualifiers.Main" private const val CONTEXT = "android.content.Context" private const val WINDOW_MANAGER = "android.view.WindowManager" @@ -108,13 +108,10 @@ class ShadeDisplayAwareDetector : Detector(), SourceCodeScanner { // check if the parameter is a context-dependent class relevant to shade if (className !in CONTEXT_DEPENDENT_SHADE_CLASSES) return false - // check if it has @ShadeDisplayAware - if (hasAnnotation(SHADE_DISPLAY_AWARE_ANNOTATION)) return false + if (hasAnnotation(SHADE_DISPLAY_AWARE_ANNOTATION) || hasAnnotation(MAIN_ANNOTATION)) + return false // check if its a @Application-annotated Context if (className == CONTEXT && hasAnnotation(APPLICATION_ANNOTATION)) return false - // check if its a @GlobalConfig-annotated ConfigurationState, ConfigurationController - // or ConfigurationInteractor - if (className in CONFIG_CLASSES && hasAnnotation(GLOBAL_CONFIG_ANNOTATION)) return false return true } diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt index 79f190782ee8..638d7cb7ee58 100644 --- a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt +++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt @@ -73,12 +73,12 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() { ) .indented() - private val globalConfigStub: TestFile = + private val mainStub: TestFile = kotlin( """ - package com.android.systemui.common.ui + package com.android.systemui.dagger.qualifiers - @Retention(AnnotationRetention.RUNTIME) annotation class GlobalConfig + @Retention(AnnotationRetention.RUNTIME) annotation class Main """ ) .indented() @@ -119,7 +119,7 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() { qsContext, shadeDisplayAwareStub, applicationStub, - globalConfigStub, + mainStub, configStateStub, configControllerStub, configInteractorStub, @@ -308,7 +308,7 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() { } @Test - fun injectedConstructor_inRelevantPackage_withGlobalConfigAnnotatedConfigurationClass() { + fun injectedConstructor_inRelevantPackage_withMainAnnotatedConfigurationClass() { lint() .files( TestFiles.kotlin( @@ -317,11 +317,11 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() { import javax.inject.Inject import com.android.systemui.common.ui.ConfigurationState - import com.android.systemui.common.ui.GlobalConfig + import com.android.systemui.dagger.qualifiers.Main class ExampleClass @Inject - constructor(@GlobalConfig private val configState: ConfigurationState) + constructor(@Main private val configState: ConfigurationState) """ .trimIndent() ), diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt index 9fe85b7a7070..029b9cde4da9 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt @@ -38,6 +38,8 @@ import androidx.compose.ui.input.pointer.PointerId import androidx.compose.ui.input.pointer.PointerInputChange import androidx.compose.ui.input.pointer.PointerInputScope import androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNode +import androidx.compose.ui.input.pointer.changedToDownIgnoreConsumed +import androidx.compose.ui.input.pointer.changedToUpIgnoreConsumed import androidx.compose.ui.input.pointer.positionChange import androidx.compose.ui.input.pointer.util.VelocityTracker import androidx.compose.ui.input.pointer.util.addPointerInputChange @@ -50,6 +52,7 @@ import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.Velocity import androidx.compose.ui.util.fastAny +import androidx.compose.ui.util.fastSumBy import com.android.compose.modifiers.thenIf import kotlin.math.sign import kotlinx.coroutines.CoroutineScope @@ -65,9 +68,10 @@ import kotlinx.coroutines.launch interface NestedDraggable { /** * Called when a drag is started in the given [position] (*before* dragging the touch slop) and - * in the direction given by [sign]. + * in the direction given by [sign], with the given number of [pointersDown] when the touch slop + * was detected. */ - fun onDragStarted(position: Offset, sign: Float): Controller + fun onDragStarted(position: Offset, sign: Float, pointersDown: Int): Controller /** * Whether this draggable should consume any scroll amount with the given [sign] coming from a @@ -170,6 +174,9 @@ private class NestedDraggableNode( */ private var lastFirstDown: Offset? = null + /** The number of pointers down. */ + private var pointersDownCount = 0 + init { delegate(nestedScrollModifierNode(this, nestedScrollDispatcher)) } @@ -234,6 +241,11 @@ private class NestedDraggableNode( awaitEachGesture { val down = awaitFirstDown(requireUnconsumed = false) + check(down.position == lastFirstDown) { + "Position from detectDrags() is not the same as position in trackDownPosition()" + } + check(pointersDownCount == 1) { "pointersDownCount is equal to $pointersDownCount" } + var overSlop = 0f val onTouchSlopReached = { change: PointerInputChange, over: Float -> change.consume() @@ -276,10 +288,13 @@ private class NestedDraggableNode( if (drag != null) { velocityTracker.resetTracking() - val sign = (drag.position - down.position).toFloat().sign + check(pointersDownCount > 0) { "pointersDownCount is equal to $pointersDownCount" } val wrappedController = - WrappedController(coroutineScope, draggable.onDragStarted(down.position, sign)) + WrappedController( + coroutineScope, + draggable.onDragStarted(down.position, sign, pointersDownCount), + ) if (overSlop != 0f) { onDrag(wrappedController, drag, overSlop, velocityTracker) } @@ -424,7 +439,22 @@ private class NestedDraggableNode( */ private suspend fun PointerInputScope.trackDownPosition() { - awaitEachGesture { lastFirstDown = awaitFirstDown(requireUnconsumed = false).position } + awaitEachGesture { + val down = awaitFirstDown(requireUnconsumed = false) + lastFirstDown = down.position + pointersDownCount = 1 + + do { + pointersDownCount += + awaitPointerEvent().changes.fastSumBy { change -> + when { + change.changedToDownIgnoreConsumed() -> 1 + change.changedToUpIgnoreConsumed() -> -1 + else -> 0 + } + } + } while (pointersDownCount > 0) + } } override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { @@ -451,8 +481,14 @@ private class NestedDraggableNode( val sign = offset.sign if (nestedScrollController == null && draggable.shouldConsumeNestedScroll(sign)) { val startedPosition = checkNotNull(lastFirstDown) { "lastFirstDown is not set" } + + // TODO(b/382665591): Replace this by check(pointersDownCount > 0). + val pointersDown = pointersDownCount.coerceAtLeast(1) nestedScrollController = - WrappedController(coroutineScope, draggable.onDragStarted(startedPosition, sign)) + WrappedController( + coroutineScope, + draggable.onDragStarted(startedPosition, sign, pointersDown), + ) } val controller = nestedScrollController ?: return Offset.Zero diff --git a/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt b/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt index a499447fc367..fe3faafded6f 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt @@ -37,4 +37,4 @@ fun colorAttr(context: Context, @AttrRes attr: Int): Color { @ColorInt val color = ta.getColor(0, 0) ta.recycle() return Color(color) -} +}
\ No newline at end of file diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt index fd3902fa7dc8..735ab68bc6a6 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt +++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt @@ -41,6 +41,7 @@ import androidx.compose.ui.test.swipeDown import androidx.compose.ui.test.swipeLeft import androidx.compose.ui.unit.Velocity import com.google.common.truth.Truth.assertThat +import kotlin.math.ceil import kotlinx.coroutines.awaitCancellation import org.junit.Ignore import org.junit.Rule @@ -383,6 +384,79 @@ class NestedDraggableTest(override val orientation: Orientation) : OrientationAw assertThat(draggable.onDragStoppedCalled).isTrue() } + @Test + fun pointersDown() { + val draggable = TestDraggable() + val touchSlop = + rule.setContentWithTouchSlop { + Box(Modifier.fillMaxSize().nestedDraggable(draggable, orientation)) + } + + (1..5).forEach { nDown -> + rule.onRoot().performTouchInput { + repeat(nDown) { pointerId -> down(pointerId, center) } + + moveBy(pointerId = 0, touchSlop.toOffset()) + } + + assertThat(draggable.onDragStartedPointersDown).isEqualTo(nDown) + + rule.onRoot().performTouchInput { + repeat(nDown) { pointerId -> up(pointerId = pointerId) } + } + } + } + + @Test + fun pointersDown_nestedScroll() { + val draggable = TestDraggable() + val touchSlop = + rule.setContentWithTouchSlop { + Box( + Modifier.fillMaxSize() + .nestedDraggable(draggable, orientation) + .nestedScrollable(rememberScrollState()) + ) + } + + (1..5).forEach { nDown -> + rule.onRoot().performTouchInput { + repeat(nDown) { pointerId -> down(pointerId, center) } + + moveBy(pointerId = 0, (touchSlop + 1f).toOffset()) + } + + assertThat(draggable.onDragStartedPointersDown).isEqualTo(nDown) + + rule.onRoot().performTouchInput { + repeat(nDown) { pointerId -> up(pointerId = pointerId) } + } + } + } + + @Test + fun pointersDown_downThenUpThenDown() { + val draggable = TestDraggable() + val touchSlop = + rule.setContentWithTouchSlop { + Box(Modifier.fillMaxSize().nestedDraggable(draggable, orientation)) + } + + val slopThird = ceil(touchSlop / 3f).toOffset() + rule.onRoot().performTouchInput { + repeat(5) { down(pointerId = it, center) } // + 5 + moveBy(pointerId = 0, slopThird) + + listOf(2, 3).forEach { up(pointerId = it) } // - 2 + moveBy(pointerId = 0, slopThird) + + listOf(5, 6, 7).forEach { down(pointerId = it, center) } // + 3 + moveBy(pointerId = 0, slopThird) + } + + assertThat(draggable.onDragStartedPointersDown).isEqualTo(6) + } + private fun ComposeContentTestRule.setContentWithTouchSlop( content: @Composable () -> Unit ): Float { @@ -413,12 +487,18 @@ class NestedDraggableTest(override val orientation: Orientation) : OrientationAw var onDragStartedPosition = Offset.Zero var onDragStartedSign = 0f + var onDragStartedPointersDown = 0 var onDragDelta = 0f - override fun onDragStarted(position: Offset, sign: Float): NestedDraggable.Controller { + override fun onDragStarted( + position: Offset, + sign: Float, + pointersDown: Int, + ): NestedDraggable.Controller { onDragStartedCalled = true onDragStartedPosition = position onDragStartedSign = sign + onDragStartedPointersDown = pointersDown onDragDelta = 0f onDragStarted.invoke(position, sign) diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt index 737853b88f7a..96989a2df2f0 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt +++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt @@ -16,8 +16,8 @@ package com.android.compose.theme +import android.annotation.ColorRes import android.content.Context -import androidx.annotation.AttrRes import androidx.compose.material3.ColorScheme import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -70,118 +70,118 @@ class PlatformThemeTest { val colorValues = mutableListOf<ColorValue>() fun onLaunch(colorScheme: ColorScheme, context: Context) { - fun addValue(name: String, materialValue: Color, @AttrRes attr: Int) { - colorValues.add(ColorValue(name, materialValue, colorAttr(context, attr))) + fun addValue(name: String, materialValue: Color, @ColorRes color: Int) { + colorValues.add(ColorValue(name, materialValue, Color(context.getColor(color)))) } - addValue("primary", colorScheme.primary, R.attr.materialColorPrimary) - addValue("onPrimary", colorScheme.onPrimary, R.attr.materialColorOnPrimary) + addValue("primary", colorScheme.primary, R.color.materialColorPrimary) + addValue("onPrimary", colorScheme.onPrimary, R.color.materialColorOnPrimary) addValue( "primaryContainer", colorScheme.primaryContainer, - R.attr.materialColorPrimaryContainer, + R.color.materialColorPrimaryContainer, ) addValue( "onPrimaryContainer", colorScheme.onPrimaryContainer, - R.attr.materialColorOnPrimaryContainer, + R.color.materialColorOnPrimaryContainer, ) addValue( "inversePrimary", colorScheme.inversePrimary, - R.attr.materialColorInversePrimary, + R.color.materialColorInversePrimary, ) - addValue("secondary", colorScheme.secondary, R.attr.materialColorSecondary) - addValue("onSecondary", colorScheme.onSecondary, R.attr.materialColorOnSecondary) + addValue("secondary", colorScheme.secondary, R.color.materialColorSecondary) + addValue("onSecondary", colorScheme.onSecondary, R.color.materialColorOnSecondary) addValue( "secondaryContainer", colorScheme.secondaryContainer, - R.attr.materialColorSecondaryContainer, + R.color.materialColorSecondaryContainer, ) addValue( "onSecondaryContainer", colorScheme.onSecondaryContainer, - R.attr.materialColorOnSecondaryContainer, + R.color.materialColorOnSecondaryContainer, ) - addValue("tertiary", colorScheme.tertiary, R.attr.materialColorTertiary) - addValue("onTertiary", colorScheme.onTertiary, R.attr.materialColorOnTertiary) + addValue("tertiary", colorScheme.tertiary, R.color.materialColorTertiary) + addValue("onTertiary", colorScheme.onTertiary, R.color.materialColorOnTertiary) addValue( "tertiaryContainer", colorScheme.tertiaryContainer, - R.attr.materialColorTertiaryContainer, + R.color.materialColorTertiaryContainer, ) addValue( "onTertiaryContainer", colorScheme.onTertiaryContainer, - R.attr.materialColorOnTertiaryContainer, + R.color.materialColorOnTertiaryContainer, ) - addValue("onBackground", colorScheme.onBackground, R.attr.materialColorOnBackground) - addValue("surface", colorScheme.surface, R.attr.materialColorSurface) - addValue("onSurface", colorScheme.onSurface, R.attr.materialColorOnSurface) + addValue("onBackground", colorScheme.onBackground, R.color.materialColorOnBackground) + addValue("surface", colorScheme.surface, R.color.materialColorSurface) + addValue("onSurface", colorScheme.onSurface, R.color.materialColorOnSurface) addValue( "surfaceVariant", colorScheme.surfaceVariant, - R.attr.materialColorSurfaceVariant, + R.color.materialColorSurfaceVariant, ) addValue( "onSurfaceVariant", colorScheme.onSurfaceVariant, - R.attr.materialColorOnSurfaceVariant, + R.color.materialColorOnSurfaceVariant, ) addValue( "inverseSurface", colorScheme.inverseSurface, - R.attr.materialColorInverseSurface, + R.color.materialColorInverseSurface, ) addValue( "inverseOnSurface", colorScheme.inverseOnSurface, - R.attr.materialColorInverseOnSurface, + R.color.materialColorInverseOnSurface, ) - addValue("error", colorScheme.error, R.attr.materialColorError) - addValue("onError", colorScheme.onError, R.attr.materialColorOnError) + addValue("error", colorScheme.error, R.color.materialColorError) + addValue("onError", colorScheme.onError, R.color.materialColorOnError) addValue( "errorContainer", colorScheme.errorContainer, - R.attr.materialColorErrorContainer, + R.color.materialColorErrorContainer, ) addValue( "onErrorContainer", colorScheme.onErrorContainer, - R.attr.materialColorOnErrorContainer, + R.color.materialColorOnErrorContainer, ) - addValue("outline", colorScheme.outline, R.attr.materialColorOutline) + addValue("outline", colorScheme.outline, R.color.materialColorOutline) addValue( "outlineVariant", colorScheme.outlineVariant, - R.attr.materialColorOutlineVariant, + R.color.materialColorOutlineVariant, ) - addValue("surfaceBright", colorScheme.surfaceBright, R.attr.materialColorSurfaceBright) - addValue("surfaceDim", colorScheme.surfaceDim, R.attr.materialColorSurfaceDim) + addValue("surfaceBright", colorScheme.surfaceBright, R.color.materialColorSurfaceBright) + addValue("surfaceDim", colorScheme.surfaceDim, R.color.materialColorSurfaceDim) addValue( "surfaceContainer", colorScheme.surfaceContainer, - R.attr.materialColorSurfaceContainer, + R.color.materialColorSurfaceContainer, ) addValue( "surfaceContainerHigh", colorScheme.surfaceContainerHigh, - R.attr.materialColorSurfaceContainerHigh, + R.color.materialColorSurfaceContainerHigh, ) addValue( "surfaceContainerHighest", colorScheme.surfaceContainerHighest, - R.attr.materialColorSurfaceContainerHighest, + R.color.materialColorSurfaceContainerHighest, ) addValue( "surfaceContainerLow", colorScheme.surfaceContainerLow, - R.attr.materialColorSurfaceContainerLow, + R.color.materialColorSurfaceContainerLow, ) addValue( "surfaceContainerLowest", colorScheme.surfaceContainerLowest, - R.attr.materialColorSurfaceContainerLowest, + R.color.materialColorSurfaceContainerLowest, ) } @@ -200,9 +200,9 @@ class PlatformThemeTest { "MaterialTheme.colorScheme.${colorValue.name} matches attribute color" ) .that(colorValue.materialValue) - .isEqualTo(colorValue.attrValue) + .isEqualTo(colorValue.colorValue) } } - private data class ColorValue(val name: String, val materialValue: Color, val attrValue: Color) + private data class ColorValue(val name: String, val materialValue: Color, val colorValue: Color) } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt b/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt index 64b9f2df144b..81ae6b39e06b 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt @@ -19,6 +19,7 @@ package com.android.systemui.common.ui.compose import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.colorResource import com.android.compose.theme.colorAttr /** Resolves [com.android.systemui.common.shared.model.Color] into [Color] */ @@ -28,5 +29,6 @@ fun com.android.systemui.common.shared.model.Color.toColor(): Color { return when (this) { is com.android.systemui.common.shared.model.Color.Attribute -> colorAttr(attribute) is com.android.systemui.common.shared.model.Color.Loaded -> Color(color) + is com.android.systemui.common.shared.model.Color.Resource -> colorResource(colorRes) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt index a55b6d720dd6..315dc342dcd0 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt @@ -43,6 +43,8 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.focusable import androidx.compose.foundation.gestures.awaitFirstDown import androidx.compose.foundation.gestures.detectHorizontalDragGestures +import androidx.compose.foundation.gestures.snapping.SnapPosition +import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -151,6 +153,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntRect import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.LayoutDirection @@ -749,10 +752,13 @@ private fun HorizontalGridWrapper( content: LazyGridScope.(sizeInfo: SizeInfo?) -> Unit, ) { if (communalResponsiveGrid()) { + val flingBehavior = + rememberSnapFlingBehavior(lazyGridState = gridState, snapPosition = SnapPosition.Start) ResponsiveLazyHorizontalGrid( cellAspectRatio = 1.5f, modifier = modifier, state = gridState, + flingBehavior = flingBehavior, minContentPadding = minContentPadding, minHorizontalArrangement = Dimensions.ItemSpacing, minVerticalArrangement = Dimensions.ItemSpacing, @@ -909,7 +915,7 @@ private fun BoxScope.CommunalHubLazyGrid( Arrangement.spacedBy( sizeInfo?.verticalArrangement ?: Dimensions.ItemSpacing ), - enabled = selected, + enabled = selected && !isItemDragging, alpha = { outlineAlpha }, modifier = Modifier.requiredSize(dpSize) @@ -947,12 +953,28 @@ private fun BoxScope.CommunalHubLazyGrid( } } } else { + val itemAlpha = + if (communalResponsiveGrid()) { + val percentVisible by + remember(gridState, index) { + derivedStateOf { calculatePercentVisible(gridState, index) } + } + animateFloatAsState(percentVisible) + } else { + null + } + CommunalContent( model = item, viewModel = viewModel, size = size, selected = false, - modifier = Modifier.requiredSize(dpSize).animateItem(), + modifier = + Modifier.requiredSize(dpSize).animateItem().thenIf( + communalResponsiveGrid() + ) { + Modifier.graphicsLayer { alpha = itemAlpha?.value ?: 1f } + }, index = index, contentListState = contentListState, interactionHandler = interactionHandler, @@ -1856,6 +1878,44 @@ private fun CommunalContentModel.getSpanOrMax(maxSpan: Int?) = size.span } +private fun IntRect.percentOverlap(other: IntRect): Float { + val intersection = intersect(other) + if (intersection.width < 0 || intersection.height < 0) { + return 0f + } + val overlapArea = intersection.width * intersection.height + val area = width * height + return overlapArea.toFloat() / area.toFloat() +} + +private fun calculatePercentVisible(state: LazyGridState, index: Int): Float { + val viewportSize = state.layoutInfo.viewportSize + val visibleRect = + IntRect( + offset = + IntOffset( + state.layoutInfo.viewportStartOffset + state.layoutInfo.beforeContentPadding, + 0, + ), + size = + IntSize( + width = + viewportSize.width - + state.layoutInfo.beforeContentPadding - + state.layoutInfo.afterContentPadding, + height = viewportSize.height, + ), + ) + + val itemInfo = state.layoutInfo.visibleItemsInfo.find { it.index == index } + return if (itemInfo != null) { + val boundingBox = IntRect(itemInfo.offset, itemInfo.size) + boundingBox.percentOverlap(visibleRect) + } else { + 0f + } +} + private object Colors { val DisabledColorFilter by lazy { disabledColorMatrix() } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt index ef5e90bd7aad..7a500805809d 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt @@ -94,7 +94,7 @@ internal constructor( private val scope: CoroutineScope, private val updateDragPositionForRemove: (draggingBoundingBox: IntRect) -> Boolean, ) { - var draggingItemKey by mutableStateOf<Any?>(null) + var draggingItemKey by mutableStateOf<String?>(null) private set var isDraggingToRemove by mutableStateOf(false) @@ -138,7 +138,7 @@ internal constructor( // before content padding from the initial pointer position .firstItemAtOffset(normalizedOffset - contentOffset) ?.apply { - draggingItemKey = key + draggingItemKey = key as String draggingItemInitialOffset = this.offset.toOffset() return true } @@ -284,7 +284,9 @@ fun Modifier.dragContainer( contentOffset, ) ) { - viewModel.onReorderWidgetStart() + // draggingItemKey is guaranteed to be non-null here because it is set in + // onDragStart() + viewModel.onReorderWidgetStart(dragDropState.draggingItemKey!!) } }, onDragEnd = { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt index 21b34748a364..c7930549abe8 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt @@ -36,7 +36,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.toComposeRect import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.Dp @@ -45,6 +47,7 @@ import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.coerceAtMost import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.times +import androidx.window.layout.WindowMetricsCalculator /** * Renders a responsive [LazyHorizontalGrid] with dynamic columns and rows. Each cell will maintain @@ -71,7 +74,7 @@ fun ResponsiveLazyHorizontalGrid( "$minHorizontalArrangement and $minVerticalArrangement, respectively." } BoxWithConstraints(modifier) { - val gridSize = rememberGridSize(maxWidth = maxWidth, maxHeight = maxHeight) + val gridSize = rememberGridSize() val layoutDirection = LocalLayoutDirection.current val density = LocalDensity.current @@ -128,25 +131,43 @@ fun ResponsiveLazyHorizontalGrid( val extraWidth = maxWidth - usedWidth val extraHeight = maxHeight - usedHeight - val finalStartPadding = minStartPadding + extraWidth / 2 + // If there is a single column or single row, distribute extra space evenly across the grid. + // Otherwise, distribute it along the content padding to center the content. + val distributeHorizontalSpaceAlongGutters = gridSize.height == 1 || gridSize.width == 1 + val evenlyDistributedWidth = + if (distributeHorizontalSpaceAlongGutters) { + extraWidth / (gridSize.width + 1) + } else { + extraWidth / 2 + } + + val finalStartPadding = minStartPadding + evenlyDistributedWidth + val finalEndPadding = minEndPadding + evenlyDistributedWidth val finalTopPadding = minTopPadding + extraHeight / 2 val finalContentPadding = PaddingValues( start = finalStartPadding, - end = minEndPadding + extraWidth / 2, + end = finalEndPadding, top = finalTopPadding, bottom = minBottomPadding + extraHeight / 2, ) with(density) { setContentOffset(Offset(finalStartPadding.toPx(), finalTopPadding.toPx())) } + val horizontalArrangement = + if (distributeHorizontalSpaceAlongGutters) { + minHorizontalArrangement + evenlyDistributedWidth + } else { + minHorizontalArrangement + } + LazyHorizontalGrid( rows = GridCells.Fixed(gridSize.height), modifier = Modifier.fillMaxSize(), state = state, contentPadding = finalContentPadding, - horizontalArrangement = Arrangement.spacedBy(minHorizontalArrangement), + horizontalArrangement = Arrangement.spacedBy(horizontalArrangement), verticalArrangement = Arrangement.spacedBy(minVerticalArrangement), flingBehavior = flingBehavior, userScrollEnabled = userScrollEnabled, @@ -210,27 +231,38 @@ data class SizeInfo( } @Composable -private fun rememberGridSize(maxWidth: Dp, maxHeight: Dp): IntSize { +private fun rememberGridSize(): IntSize { val configuration = LocalConfiguration.current val orientation = configuration.orientation + val screenSize = calculateWindowSize() - return remember(orientation, maxWidth, maxHeight) { + return remember(orientation, screenSize) { if (orientation == Configuration.ORIENTATION_PORTRAIT) { IntSize( - width = calculateNumCellsWidth(maxWidth), - height = calculateNumCellsHeight(maxHeight), + width = calculateNumCellsWidth(screenSize.width), + height = calculateNumCellsHeight(screenSize.height), ) } else { // In landscape we invert the rows/columns to ensure we match the same area as portrait. // This keeps the number of elements in the grid consistent when changing orientation. IntSize( - width = calculateNumCellsHeight(maxWidth), - height = calculateNumCellsWidth(maxHeight), + width = calculateNumCellsHeight(screenSize.width), + height = calculateNumCellsWidth(screenSize.height), ) } } } +@Composable +fun calculateWindowSize(): DpSize { + // Observe view configuration changes and recalculate the size class on each change. + LocalConfiguration.current + val density = LocalDensity.current + val context = LocalContext.current + val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(context) + return with(density) { metrics.bounds.toComposeRect().size.toDpSize() } +} + private fun calculateNumCellsWidth(width: Dp) = // See https://developer.android.com/develop/ui/views/layout/use-window-size-classes when { diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt index 35cdf81e8c14..59d0b55c1db8 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt @@ -337,13 +337,6 @@ internal class SwipeAnimation<T : ContentKey>( check(!isAnimatingOffset()) { "SwipeAnimation.animateOffset() can only be called once" } val initialProgress = progress - // Skip the animation if we have already reached the target content and the overscroll does - // not animate anything. - val hasReachedTargetContent = - (targetContent == toContent && initialProgress >= 1f) || - (targetContent == fromContent && initialProgress <= 0f) - val skipAnimation = - hasReachedTargetContent && !contentTransition.isWithinProgressRange(initialProgress) val targetContent = if (targetContent != currentContent && !canChangeContent(targetContent)) { @@ -352,6 +345,14 @@ internal class SwipeAnimation<T : ContentKey>( targetContent } + // Skip the animation if we have already reached the target content and the overscroll does + // not animate anything. + val hasReachedTargetContent = + (targetContent == toContent && initialProgress >= 1f) || + (targetContent == fromContent && initialProgress <= 0f) + val skipAnimation = + hasReachedTargetContent && !contentTransition.isWithinProgressRange(initialProgress) + val targetOffset = if (targetContent == fromContent) { 0f diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt index 2c8dc3264b7e..b20056d54de1 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt @@ -42,7 +42,6 @@ import com.android.compose.animation.scene.content.state.TransitionState.Transit import com.android.compose.animation.scene.subjects.assertThat import com.android.compose.test.MonotonicClockTestScope import com.android.compose.test.runMonotonicClockTest -import com.android.compose.test.transition import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred @@ -921,6 +920,28 @@ class DraggableHandlerTest { } @Test + fun blockTransition_animated() = runGestureTest { + assertIdle(SceneA) + layoutState.transitions = transitions { overscrollDisabled(SceneB, Orientation.Vertical) } + + // Swipe up to scene B. Overscroll 50%. + val dragController = onDragStarted(overSlop = up(1.5f), expectedConsumedOverSlop = up(1.0f)) + assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneB, progress = 1f) + + // Block the transition when the user release their finger. + canChangeScene = { false } + val velocityConsumed = + dragController.onDragStoppedAnimateLater(velocity = -velocityThreshold) + + // Start an animation: overscroll and from 1f to 0f. + assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneB, progress = 1f) + + val consumed = velocityConsumed.await() + assertThat(consumed).isEqualTo(-velocityThreshold) + assertIdle(SceneA) + } + + @Test fun scrollFromIdleWithNoTargetScene_shouldUseOverscrollSpecIfAvailable() = runGestureTest { layoutState.transitions = transitions { overscroll(SceneC, Orientation.Vertical) { fade(TestElements.Foo) } diff --git a/packages/SystemUI/lint-baseline.xml b/packages/SystemUI/lint-baseline.xml index 43131b103e51..b0963d352990 100644 --- a/packages/SystemUI/lint-baseline.xml +++ b/packages/SystemUI/lint-baseline.xml @@ -26857,8 +26857,8 @@ <issue id="Overdraw" - message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorOnSurfaceVariant` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)" - errorLine1=" android:background="?androidprv:attr/materialColorOnSurfaceVariant" />" + message="Possible overdraw: Root element paints background `@androidprv:color/materialColorOnSurfaceVariant` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)" + errorLine1=" android:background="@androidprv:color/materialColorOnSurfaceVariant" />" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> <location file="frameworks/base/packages/SystemUI/res/layout/notification_children_divider.xml" @@ -26868,8 +26868,8 @@ <issue id="Overdraw" - message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainerHigh` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)" - errorLine1=" android:background="?androidprv:attr/materialColorSurfaceContainerHigh"" + message="Possible overdraw: Root element paints background `@androidprv:color/materialColorSurfaceContainerHigh` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)" + errorLine1=" android:background="@androidprv:color/materialColorSurfaceContainerHigh"" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> <location file="frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml" @@ -32784,1180 +32784,4 @@ column="23"/> </issue> - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, val theme: Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/AirplaneModeMapper.kt" - line="33" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/alarm/domain/AlarmTileMapper.kt" - line="39" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @NonNull Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java" - line="300" - column="30"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" Context context, DeviceConfigProxy proxy) {" - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java" - line="75" - column="21"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" public AuthController(Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java" - line="716" - column="35"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated WindowManager, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of WindowManager is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @NonNull WindowManager windowManager," - errorLine2=" ~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java" - line="721" - column="36"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val sysuiContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt" - line="72" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated ConfigurationController, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of ConfigurationController is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val configurationController: ConfigurationController," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt" - line="74" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main protected val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/battery/ui/BatterySaverTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java" - line="46" - column="21"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main Resources resources," - errorLine2=" ~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java" - line="52" - column="29"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" public BiometricNotificationService(@NonNull Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java" - line="148" - column="58"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerActionButtonInteractor.kt" - line="62" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/BouncerRepository.kt" - line="37" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" c: Context," - errorLine2=" ~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt" - line="61" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/ColorCorrectionTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/ColorInversionTileMapper.kt" - line="33" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractor.kt" - line="52" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt" - line="30" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="class CustomTileStatePersisterImpl @Inject constructor(context: Context) :" - errorLine2=" ~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/external/CustomTileStatePersister.kt" - line="74" - column="56"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/DefaultTilesRepository.kt" - line="18" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt" - line="77" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/DisplayStateRepository.kt" - line="68" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt" - line="38" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/FaceAuthAccessibilityDelegate.kt" - line="37" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/FaceHelpMessageDeferral.kt" - line="42" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FacePropertyRepository.kt" - line="95" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt" - line="142" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt" - line="44" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapper.kt" - line="33" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/FontScalingTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @NonNull final Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java" - line="186" - column="36"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated ConfigurationController, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of ConfigurationController is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" ConfigurationController configurationController," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java" - line="192" - column="37"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/HearingDevicesTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="class IconBuilder @Inject constructor(private val context: Context) {" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt" - line="27" - column="39"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingMapper.kt" - line="31" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated WindowManager, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of WindowManager is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val windowManager: WindowManager," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt" - line="39" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt" - line="40" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/LargeTileSpanRepository.kt" - line="41" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapper.kt" - line="33" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated LayoutInflater, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of LayoutInflater is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val layoutInflater: LayoutInflater" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/MediaContainerController.kt" - line="29" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="class MinimumTilesResourceRepository @Inject constructor(@Main resources: Resources) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/MinimumTilesRepository.kt" - line="38" - column="58"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapper.kt" - line="33" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/night/domain/interactor/NightDisplayTileDataInteractor.kt" - line="38" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/night/ui/NightDisplayTileMapper.kt" - line="42" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/notes/domain/NotesTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" public NotificationGutsManager(Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java" - line="137" - column="44"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModel.kt" - line="47" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt" - line="53" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(val context: Context) {" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt" - line="27" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated ConfigurationController, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of ConfigurationController is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" ConfigurationController configurationController," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java" - line="737" - column="37"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt" - line="63" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" Builder(@Main Resources resources, ViewConfiguration viewConfiguration," - errorLine2=" ~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java" - line="563" - column="33"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/onehanded/ui/OneHandedModeTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" public PackageManagerAdapter(Context context) {" - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/external/PackageManagerAdapter.java" - line="45" - column="42"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/PaginatedGridRepository.kt" - line="36" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt" - line="74" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt" - line="41" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt" - line="82" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/qr/ui/QRCodeScannerTileMapper.kt" - line="32" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/QSColumnsRepository.kt" - line="36" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" Factory(Context context, QSCustomizerController qsCustomizerController) {" - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java" - line="99" - column="25"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/QuickQuickSettingsRowRepository.kt" - line="32" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/ui/ReduceBrightColorsTileMapper.kt" - line="33" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt" - line="36" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/rotation/domain/interactor/RotationLockTileDataInteractor.kt" - line="47" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/rotation/ui/mapper/RotationLockTileMapper.kt" - line="36" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddable.kt" - line="51" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/ui/ScreenRecordTileMapper.kt" - line="33" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated LayoutInflater, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of LayoutInflater is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val layoutInflater: LayoutInflater," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt" - line="43" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" context: Context" - errorLine2=" ~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionHeaderVisibilityProvider.kt" - line="35" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt" - line="63" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt" - line="53" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt" - line="51" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated WindowManager, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of WindowManager is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" windowManager: WindowManager," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt" - line="53" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val applicationContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractor.kt" - line="60" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractor.kt" - line="65" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/SimBouncerRepository.kt" - line="91" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(context: Context, val shadeViewController: ShadeViewController) {" - errorLine2=" ~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt" - line="30" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/StockTilesRepository.kt" - line="31" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val context: Context" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolver.kt" - line="33" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt" - line="95" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardAccessibilityDelegate.kt" - line="33" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Context is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Application private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/UdfpsOverlayInteractor.kt" - line="49" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated ConfigurationController, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of ConfigurationController is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val configurationController: ConfigurationController," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/uimodenight/domain/interactor/UiModeNightTileDataInteractor.kt" - line="43" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="constructor(@Main private val resources: Resources, private val theme: Theme) :" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/uimodenight/domain/UiModeNightTileMapper.kt" - line="37" - column="13"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of Resources is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/work/ui/WorkModeTileMapper.kt" - line="36" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window
should use ShadeDisplayAware-annotated ConfigurationInteractor, as the shade might move between windows, and only
@ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so
might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme).
If the usage of ConfigurationInteractor is not related to display specific configuration or UI, then there is
technically no need to use the annotation, and you can annotate the class with
@SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @GlobalConfig configurationInteractor: ConfigurationInteractor," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt" - line="43" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" public AuthController(Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java" - line="716" - column="35"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated WindowManager, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of WindowManager is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @NonNull WindowManager windowManager," - errorLine2=" ~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java" - line="721" - column="36"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val sysuiContext: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt" - line="72" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated ConfigurationController, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of ConfigurationController is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val configurationController: ConfigurationController," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt" - line="74" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java" - line="46" - column="21"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main Resources resources," - errorLine2=" ~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java" - line="52" - column="29"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" public BiometricNotificationService(@NonNull Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java" - line="148" - column="58"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" c: Context," - errorLine2=" ~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt" - line="61" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt" - line="39" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/FaceAuthAccessibilityDelegate.kt" - line="37" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/FaceHelpMessageDeferral.kt" - line="42" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @NonNull final Context context," - errorLine2=" ~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java" - line="186" - column="36"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1="class IconBuilder @Inject constructor(private val context: Context) {" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt" - line="27" - column="39"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated WindowManager, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of WindowManager is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val windowManager: WindowManager," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt" - line="40" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt" - line="53" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Resources, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Resources is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" @Main private val resources: Resources," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddable.kt" - line="51" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated Context, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of Context is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" private val context: Context," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt" - line="51" - column="5"/> - </issue> - - <issue - id="ShadeDisplayAwareContextChecker" - message="UI elements of the shade window should use ShadeDisplayAware-annotated WindowManager, as the shade might move between windows, and only @ShadeDisplayAware resources are updated with the new configuration correctly. Failures to do so might result in wrong dimensions for shade window classes (e.g. using the wrong density or theme). If the usage of WindowManager is not related to display specific configuration or UI, then there is technically no need to use the annotation, and you can annotate the class with @SuppressLint("ShadeDisplayAwareContextChecker")/@Suppress("ShadeDisplayAwareContextChecker")" - errorLine1=" windowManager: WindowManager," - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt" - line="53" - column="5"/> - </issues> diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java index fa8cdcc4ce2b..80de087971c5 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java @@ -24,6 +24,7 @@ import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.testing.TestableLooper; import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; @@ -39,6 +40,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -54,11 +56,15 @@ public class DragToInteractAnimationControllerTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); + @Mock + private AccessibilityManager mAccessibilityManager; + @Before public void setUp() throws Exception { final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); final SecureSettings mockSecureSettings = TestUtils.mockSecureSettings(); - final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mockSecureSettings); + final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, + mockSecureSettings); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager); final MenuView stubMenuView = spy(new MenuView(mContext, stubMenuViewModel, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java index 7e4b6f913770..24f3a29e64ee 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java @@ -16,11 +16,16 @@ package com.android.systemui.accessibility.floatingmenu; +import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; + import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; +import android.content.Context; import android.content.res.Configuration; +import android.view.accessibility.AccessibilityManager; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; @@ -28,6 +33,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.util.settings.SecureSettings; +import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -36,6 +42,8 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; /** Tests for {@link MenuInfoRepository}. */ @@ -46,16 +54,30 @@ public class MenuInfoRepositoryTest extends SysuiTestCase { public MockitoRule mockito = MockitoJUnit.rule(); @Mock + private AccessibilityManager mAccessibilityManager; + + @Mock private MenuInfoRepository.OnSettingsContentsChanged mMockSettingsContentsChanged; @Mock private SecureSettings mSecureSettings; private MenuInfoRepository mMenuInfoRepository; + private final List<String> mShortcutTargets = new ArrayList<>(); @Before public void setUp() { - mMenuInfoRepository = new MenuInfoRepository(mContext, mMockSettingsContentsChanged, - mSecureSettings); + mContext.addMockSystemService(Context.ACCESSIBILITY_SERVICE, mAccessibilityManager); + mShortcutTargets.add(MAGNIFICATION_CONTROLLER_NAME); + doReturn(mShortcutTargets).when(mAccessibilityManager).getAccessibilityShortcutTargets( + anyInt()); + + mMenuInfoRepository = new MenuInfoRepository(mContext, mAccessibilityManager, + mMockSettingsContentsChanged, mSecureSettings); + } + + @After + public void tearDown() { + mShortcutTargets.clear(); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java index 1f48bec97b2d..157cccc3d62f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java @@ -83,7 +83,8 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase { final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager); - final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mSecureSettings); + final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, + mSecureSettings); final int halfScreenHeight = stubWindowManager.getCurrentWindowMetrics().getBounds().height() / 2; diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java index f7b81cc49f0b..46f076a75116 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java @@ -33,6 +33,7 @@ import android.platform.test.annotations.EnableFlags; import android.testing.TestableLooper; import android.view.MotionEvent; import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager; import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.recyclerview.widget.RecyclerView; @@ -52,6 +53,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -78,11 +80,15 @@ public class MenuListViewTouchHandlerTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); + @Mock + private AccessibilityManager mAccessibilityManager; + @Before public void setUp() throws Exception { final WindowManager windowManager = mContext.getSystemService(WindowManager.class); final SecureSettings secureSettings = TestUtils.mockSecureSettings(); - final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, secureSettings); + final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, + secureSettings); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, windowManager); mStubMenuView = new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java index c1708d175224..ee8ce17cecd4 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java @@ -32,6 +32,7 @@ import android.graphics.drawable.GradientDrawable; import android.platform.test.annotations.EnableFlags; import android.testing.TestableLooper; import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; @@ -48,6 +49,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -66,6 +68,9 @@ public class MenuViewTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); + @Mock + private AccessibilityManager mAccessibilityManager; + private SysuiTestableContext mSpyContext; @Before @@ -84,7 +89,8 @@ public class MenuViewTest extends SysuiTestCase { doNothing().when(mSpyContext).startActivity(any()); final SecureSettings secureSettings = TestUtils.mockSecureSettings(); - final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, secureSettings); + final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, + secureSettings); final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); mStubMenuViewAppearance = new MenuViewAppearance(mSpyContext, stubWindowManager); mMenuView = spy(new MenuView(mSpyContext, stubMenuViewModel, mStubMenuViewAppearance, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt index d75c0138bcbf..ab936590de93 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt @@ -1589,7 +1589,8 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa val logoInfo by collectLastValue(kosmos.promptViewModel.logoInfo) assertThat(logoInfo).isNotNull() assertThat(logoInfo!!.first).isEqualTo(defaultLogoIconWithBadge) - assertThat(logoInfo!!.second).isEqualTo(defaultLogoDescriptionWithBadge) + // Logo label does not use badge info. + assertThat(logoInfo!!.second).isEqualTo(defaultLogoDescriptionFromAppInfo) } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt index 84d062a3e7be..831012c88f7b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt @@ -30,7 +30,6 @@ import android.view.windowManager import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.airbnb.lottie.model.KeyPath -import com.android.settingslib.Utils import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository @@ -77,20 +76,14 @@ class SideFpsOverlayViewModelTest : SysuiTestCase() { private val contextDisplayInfo = DisplayInfo() - private val indicatorColor = - Utils.getColorAttrDefaultColor( - context, - com.android.internal.R.attr.materialColorPrimaryFixed, + private val indicatorColor = context.getColor( + com.android.internal.R.color.materialColorPrimaryFixed, ) - private val outerRimColor = - Utils.getColorAttrDefaultColor( - context, - com.android.internal.R.attr.materialColorPrimaryFixedDim, + private val outerRimColor = context.getColor( + com.android.internal.R.color.materialColorPrimaryFixedDim, ) - private val chevronFill = - Utils.getColorAttrDefaultColor( - context, - com.android.internal.R.attr.materialColorOnPrimaryFixed, + private val chevronFill = context.getColor( + com.android.internal.R.color.materialColorOnPrimaryFixed, ) private val color_blue400 = context.getColor(com.android.settingslib.color.R.color.settingslib_color_blue400) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt index 5bbd3ffc625a..18cc8bf5f0d3 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt @@ -172,16 +172,16 @@ class CommunalEditModeViewModelTest : SysuiTestCase() { } @Test - fun selectedKey_onReorderWidgets_isCleared() = + fun selectedKey_onReorderWidgets_isSet() = testScope.runTest { val selectedKey by collectLastValue(underTest.selectedKey) + underTest.setSelectedKey(null) + assertThat(selectedKey).isNull() + val key = CommunalContentModel.KEY.widget(123) - underTest.setSelectedKey(key) + underTest.onReorderWidgetStart(key) assertThat(selectedKey).isEqualTo(key) - - underTest.onReorderWidgetStart() - assertThat(selectedKey).isNull() } @Test @@ -234,7 +234,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() { @Test fun reorderWidget_uiEventLogging_start() { - underTest.onReorderWidgetStart() + underTest.onReorderWidgetStart(CommunalContentModel.KEY.widget(123)) verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_START) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt index 763ea392deb9..9d711ab0cd29 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt @@ -19,6 +19,7 @@ package com.android.systemui.communal.view.viewmodel import android.content.ComponentName import android.content.pm.UserInfo import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.FlagsParameterization import android.provider.Settings import android.widget.RemoteViews @@ -26,6 +27,7 @@ import androidx.test.filters.SmallTest import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.Flags.FLAG_COMMUNAL_HUB import com.android.systemui.Flags.FLAG_COMMUNAL_RESPONSIVE_GRID +import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_DIRECT_EDIT_MODE import com.android.systemui.SysuiTestCase import com.android.systemui.communal.data.model.CommunalSmartspaceTimer import com.android.systemui.communal.data.repository.FakeCommunalMediaRepository @@ -101,6 +103,7 @@ import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any import org.mockito.kotlin.atLeastOnce import org.mockito.kotlin.eq import org.mockito.kotlin.mock @@ -442,6 +445,7 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test + @DisableFlags(FLAG_GLANCEABLE_HUB_DIRECT_EDIT_MODE) fun customizeWidgetButton_showsThenHidesAfterTimeout() = testScope.runTest { tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED) @@ -455,6 +459,7 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test + @DisableFlags(FLAG_GLANCEABLE_HUB_DIRECT_EDIT_MODE) fun customizeWidgetButton_onDismiss_hidesImmediately() = testScope.runTest { tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED) @@ -468,6 +473,14 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test + @EnableFlags(FLAG_GLANCEABLE_HUB_DIRECT_EDIT_MODE) + fun longClickDirectlyStartsEditMode() = + testScope.runTest { + underTest.onLongClick() + verify(communalInteractor).showWidgetEditor(any()) + } + + @Test fun canChangeScene_shadeNotExpanded() = testScope.runTest { // On keyguard without any shade expansion. diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java index dd3f991e60b7..2ae611d236e9 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java @@ -133,6 +133,7 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { */ @Test public void testViewModelObservation() { + mController.onViewAttached(); final Observer<Collection<ComplicationViewModel>> observer = captureComplicationViewModelsObserver(); @@ -152,6 +153,7 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { @Test public void testMalformedComplicationAddition() { + mController.onViewAttached(); final Observer<Collection<ComplicationViewModel>> observer = captureComplicationViewModelsObserver(); @@ -167,6 +169,7 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { @Test public void testNewComplicationsBeforeEntryAnimationsFinishSetToInvisible() { + mController.onViewAttached(); final Observer<Collection<ComplicationViewModel>> observer = captureComplicationViewModelsObserver(); @@ -181,6 +184,7 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { @Test public void testNewComplicationsAfterEntryAnimationsFinishNotSetToInvisible() { + mController.onViewAttached(); final Observer<Collection<ComplicationViewModel>> observer = captureComplicationViewModelsObserver(); @@ -198,6 +202,7 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { @Test public void testAnimationsDisabled_ComplicationsNeverSetToInvisible() { + mController.onViewAttached(); //Disable animations mController.mIsAnimationEnabled = false; @@ -213,6 +218,16 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { verify(mComplicationView, never()).setVisibility(View.INVISIBLE); } + @Test + public void testLifecycleObserve_activeOnlyDuringAttachedState() { + verify(mComplicationViewModelLiveData, never()).observe(any(), any()); + mController.onViewAttached(); + final Observer<Collection<ComplicationViewModel>> observer = + captureComplicationViewModelsObserver(); + mController.onViewDetached(); + verify(mComplicationViewModelLiveData).removeObserver(eq(observer)); + } + private Observer<Collection<ComplicationViewModel>> captureComplicationViewModelsObserver() { verify(mComplicationViewModelLiveData).observe(eq(mLifecycleOwner), mObserverCaptor.capture()); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/doze/DozeScreenStateTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/doze/DozeScreenStateTest.java index bbd78b317560..4f2c1ed6c778 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/doze/DozeScreenStateTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/doze/DozeScreenStateTest.java @@ -50,6 +50,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.UdfpsController; +import com.android.systemui.keyguard.domain.interactor.DozeInteractor; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; import com.android.systemui.util.wakelock.WakeLockFake; @@ -87,6 +88,8 @@ public class DozeScreenStateTest extends SysuiTestCase { @Mock private DozeScreenBrightness mDozeScreenBrightness; @Mock + private DozeInteractor mDozeInteractor; + @Mock private SelectedUserInteractor mSelectedUserInteractor; @Before @@ -103,7 +106,7 @@ public class DozeScreenStateTest extends SysuiTestCase { mWakeLock = new WakeLockFake(); mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeHost, mDozeParameters, mWakeLock, mAuthController, mUdfpsControllerProvider, mDozeLog, - mDozeScreenBrightness, mSelectedUserInteractor); + mDozeScreenBrightness, mDozeInteractor, mSelectedUserInteractor); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/OWNERS b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/OWNERS new file mode 100644 index 000000000000..2355c48158f7 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 1562219 +chrisgollner@google.com +jmokut@google.com
\ No newline at end of file diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt index 969dacec65a1..7dc7016e5e74 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt @@ -40,7 +40,6 @@ import com.android.systemui.keyboard.shortcut.shared.model.KeyCombination import com.android.systemui.keyboard.shortcut.shared.model.Shortcut import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategory import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType -import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.AppCategories import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.MultiTasking import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.System import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCommand @@ -553,18 +552,8 @@ object TestShortcuts { simpleShortcutCategory( MultiTasking, "Split screen", - "Switch to app on left or above while using split screen", - ), - simpleShortcutCategory( - MultiTasking, - "Split screen", "Use split screen with app on the right", ), - simpleShortcutCategory( - MultiTasking, - "Split screen", - "Switch to app on right or below while using split screen", - ), simpleShortcutCategory(System, "System controls", "Show shortcuts"), simpleShortcutCategory(System, "System controls", "View recent apps"), ) @@ -595,15 +584,9 @@ object TestShortcuts { keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT ), simpleInputGestureData( - keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT - ), - simpleInputGestureData( keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT ), simpleInputGestureData( - keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT - ), - simpleInputGestureData( keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER ), simpleInputGestureData(keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS), diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt index 5e9badc58d8b..4dbe7c8bdb5a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt @@ -28,6 +28,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope +import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.shadeTestUtil import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat @@ -171,8 +172,10 @@ class AodToLockscreenTransitionViewModelTest(flags: FlagsParameterization) : Sys // WHEN transition is cancelled repository.sendTransitionStep(step(.1f, TransitionState.CANCELED)) - // THEN alpha is immediately set to 1f (expected lockscreen alpha state) - assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f) + // THEN alpha updates according to whether the scene framework is enabled (CANCELED is + // ignored when the scene framework is enabled). + assertThat(deviceEntryBackgroundViewAlpha) + .isEqualTo(if (SceneContainerFlag.isEnabled) 0f else 1f) } @Test @@ -195,14 +198,14 @@ class AodToLockscreenTransitionViewModelTest(flags: FlagsParameterization) : Sys private fun step( value: Float, - state: TransitionState = TransitionState.RUNNING + state: TransitionState = TransitionState.RUNNING, ): TransitionStep { return TransitionStep( from = KeyguardState.AOD, to = KeyguardState.LOCKSCREEN, value = value, transitionState = state, - ownerName = "AodToLockscreenTransitionViewModelTest" + ownerName = "AodToLockscreenTransitionViewModelTest", ) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt index d0da2e9671c0..576795d7e293 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt @@ -38,6 +38,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope import com.android.systemui.res.R +import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.ShadeTestUtil import com.android.systemui.shade.shadeTestUtil import com.android.systemui.testKosmos @@ -178,11 +179,13 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) ), testScope = testScope, ) - assertThat(values.size).isEqualTo(3) + assertThat(values.size).isEqualTo(if (SceneContainerFlag.isEnabled) 2 else 3) values.forEach { assertThat(it).isIn(Range.closed(0f, 100f)) } - // Cancel will reset the translation - assertThat(values[2]).isEqualTo(0) + // When the scene framework is not enabled, cancel will reset the translation + if (!SceneContainerFlag.isEnabled) { + assertThat(values.last()).isEqualTo(0f) + } } @Test @@ -242,8 +245,9 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) // WHEN transition is canceled repository.sendTransitionStep(step(1f, TransitionState.CANCELED)) - // THEN alpha is immediately set to 0f - assertThat(actual).isEqualTo(0f) + // THEN alpha updates according to whether the scene framework is enabled (CANCELED is + // ignored when the scene framework is enabled). + assertThat(actual).isEqualTo(if (SceneContainerFlag.isEnabled) 1f else 0f) } private fun step( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt index d921dde1fa44..a36e0eac086e 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt @@ -9,6 +9,7 @@ import com.android.systemui.model.SysUiState import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.recents.OverviewProxyService +import com.android.systemui.settings.DisplayTracker import com.android.systemui.shared.system.QuickStepContract import com.android.systemui.shared.system.TaskStackChangeListeners import com.android.systemui.statusbar.CommandQueue @@ -59,6 +60,7 @@ class TaskbarDelegateTest : SysuiTestCase() { @Mock lateinit var mCurrentSysUiState: NavBarHelper.CurrentSysuiState @Mock lateinit var mStatusBarKeyguardViewManager: StatusBarKeyguardViewManager @Mock lateinit var mStatusBarStateController: StatusBarStateController + @Mock lateinit var mDisplayTracker: DisplayTracker @Before fun setup() { @@ -87,6 +89,7 @@ class TaskbarDelegateTest : SysuiTestCase() { mOptionalPip, mBackAnimation, mTaskStackChangeListeners, + mDisplayTracker, ) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt index 53dec696004d..f725e06fd0e1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt @@ -18,6 +18,7 @@ package com.android.systemui.power.domain.interactor import android.os.PowerManager +import android.view.Display import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -25,9 +26,12 @@ import com.android.systemui.camera.cameraGestureHelper import com.android.systemui.classifier.FalsingCollector import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository +import com.android.systemui.keyguard.domain.interactor.dozeInteractor import com.android.systemui.kosmos.testScope import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository +import com.android.systemui.power.data.repository.fakePowerRepository +import com.android.systemui.power.shared.model.DozeScreenStateModel import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.statusbar.phone.ScreenOffAnimationController @@ -51,9 +55,9 @@ class PowerInteractorTest : SysuiTestCase() { private val kosmos = testKosmos() private val testScope = kosmos.testScope private val cameraGestureHelper = kosmos.cameraGestureHelper + private val repository: FakePowerRepository = kosmos.fakePowerRepository private lateinit var underTest: PowerInteractor - private lateinit var repository: FakePowerRepository private val keyguardRepository = FakeKeyguardRepository() @Mock private lateinit var falsingCollector: FalsingCollector @Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController @@ -63,7 +67,6 @@ class PowerInteractorTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) - repository = FakePowerRepository() underTest = PowerInteractor( repository, @@ -208,7 +211,7 @@ class PowerInteractorTest : SysuiTestCase() { whenever(cameraGestureHelper.canCameraGestureBeLaunched(any())).thenReturn(false) underTest.onStartedWakingUp( PowerManager.WAKE_REASON_POWER_BUTTON, - /*powerButtonLaunchGestureTriggeredDuringSleep= */ false + /*powerButtonLaunchGestureTriggeredDuringSleep= */ false, ) underTest.onFinishedWakingUp() underTest.onCameraLaunchGestureDetected() @@ -224,7 +227,7 @@ class PowerInteractorTest : SysuiTestCase() { fun onCameraLaunchGestureDetected_maintainsAllOtherState() { underTest.onStartedWakingUp( PowerManager.WAKE_REASON_POWER_BUTTON, - /*powerButtonLaunchGestureTriggeredDuringSleep= */ false + /*powerButtonLaunchGestureTriggeredDuringSleep= */ false, ) underTest.onFinishedWakingUp() underTest.onCameraLaunchGestureDetected() @@ -244,7 +247,7 @@ class PowerInteractorTest : SysuiTestCase() { underTest.onFinishedGoingToSleep(/* powerButtonLaunchGestureTriggeredDuringSleep= */ false) underTest.onStartedWakingUp( PowerManager.WAKE_REASON_POWER_BUTTON, - /*powerButtonLaunchGestureTriggeredDuringSleep= */ false + /*powerButtonLaunchGestureTriggeredDuringSleep= */ false, ) underTest.onFinishedWakingUp() @@ -262,7 +265,7 @@ class PowerInteractorTest : SysuiTestCase() { // This state should only be reset onStartedGoingToSleep. underTest.onStartedWakingUp( PowerManager.WAKE_REASON_POWER_BUTTON, - /*powerButtonLaunchGestureTriggeredDuringSleep= */ false + /*powerButtonLaunchGestureTriggeredDuringSleep= */ false, ) underTest.onFinishedWakingUp() @@ -272,4 +275,26 @@ class PowerInteractorTest : SysuiTestCase() { .isEqualTo(WakeSleepReason.POWER_BUTTON) assertTrue(repository.wakefulness.value.powerButtonLaunchGestureTriggered) } + + @Test + fun dozeScreenState() = + testScope.runTest { + val dozeScreenState by collectLastValue(underTest.dozeScreenState) + assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.UNKNOWN) + + kosmos.dozeInteractor.setDozeScreenState(Display.STATE_OFF) + assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.OFF) + + kosmos.dozeInteractor.setDozeScreenState(Display.STATE_ON) + assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.ON) + + kosmos.dozeInteractor.setDozeScreenState(Display.STATE_DOZE) + assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.DOZE) + + kosmos.dozeInteractor.setDozeScreenState(Display.STATE_DOZE_SUSPEND) + assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.DOZE_SUSPEND) + + kosmos.dozeInteractor.setDozeScreenState(Display.STATE_ON_SUSPEND) + assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.ON_SUSPEND) + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/FgsManagerControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/FgsManagerControllerTest.java index 0356422bda04..004aeb069a14 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/FgsManagerControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/FgsManagerControllerTest.java @@ -122,7 +122,7 @@ public class FgsManagerControllerTest extends SysuiTestCase { mSystemClock = new FakeSystemClock(); mMainExecutor = new FakeExecutor(mSystemClock); mBackgroundExecutor = new FakeExecutor(mSystemClock); - when(mSystemUIDialogFactory.create()).thenReturn(mSystemUIDialog); + when(mSystemUIDialogFactory.create(eq(mContext))).thenReturn(mSystemUIDialog); mUserProfiles = new ArrayList<>(); Mockito.doReturn(mUserProfiles).when(mUserTracker).getUserProfiles(); @@ -346,6 +346,7 @@ public class FgsManagerControllerTest extends SysuiTestCase { SystemUiDeviceConfigFlags.TASK_MANAGER_SHOW_USER_VISIBLE_JOBS, "true", false); FgsManagerController fmc = new FgsManagerControllerImpl( + mContext, mContext.getResources(), mMainExecutor, mBackgroundExecutor, @@ -373,6 +374,7 @@ public class FgsManagerControllerTest extends SysuiTestCase { SystemUiDeviceConfigFlags.TASK_MANAGER_SHOW_USER_VISIBLE_JOBS, "false", false); fmc = new FgsManagerControllerImpl( + mContext, mContext.getResources(), mMainExecutor, mBackgroundExecutor, @@ -485,6 +487,7 @@ public class FgsManagerControllerTest extends SysuiTestCase { ArgumentCaptor.forClass(BroadcastReceiver.class); FgsManagerController result = new FgsManagerControllerImpl( + mContext, mContext.getResources(), mMainExecutor, mBackgroundExecutor, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/data/repository/StockTilesRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/data/repository/StockTilesRepositoryTest.kt index 56cead19d1df..0d2f4eec370d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/data/repository/StockTilesRepositoryTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/data/repository/StockTilesRepositoryTest.kt @@ -17,8 +17,11 @@ package com.android.systemui.qs.panels.data.repository import android.content.res.mainResources +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.server.display.feature.flags.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.res.R @@ -30,12 +33,49 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) @SmallTest class StockTilesRepositoryTest : SysuiTestCase() { - private val kosmos = testKosmos() + private val kosmos = + testKosmos().apply { mainResources = mContext.orCreateTestableResources.resources } - private val underTest = StockTilesRepository(kosmos.mainResources) + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + fun stockTilesMatchesResources_evenDimmerFlagOn_configOn() { + // Enable the EvenDimmer config + mContext + .getOrCreateTestableResources() + .addOverride(com.android.internal.R.bool.config_evenDimmerEnabled, true) + val underTest = StockTilesRepository(kosmos.mainResources) + + val expected = + kosmos.mainResources + .getString(R.string.quick_settings_tiles_stock) + .split(",") + .filterNot { it.equals("reduce_brightness") } + .map(TileSpec::create) + assertThat(underTest.stockTiles).isEqualTo(expected) + } + + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + fun stockTilesMatchesResources_evenDimmerFlagOn_configOff() { + // Disable the EvenDimmer config + mContext + .getOrCreateTestableResources() + .addOverride(com.android.internal.R.bool.config_evenDimmerEnabled, false) + val underTest = StockTilesRepository(kosmos.mainResources) + + val expected = + kosmos.mainResources + .getString(R.string.quick_settings_tiles_stock) + .split(",") + .map(TileSpec::create) + assertThat(underTest.stockTiles).isEqualTo(expected) + } @Test - fun stockTilesMatchesResources() { + @DisableFlags(Flags.FLAG_EVEN_DIMMER) + fun stockTilesMatchesResources_evenDimmerFlagOff() { + val underTest = StockTilesRepository(kosmos.mainResources) + val expected = kosmos.mainResources .getString(R.string.quick_settings_tiles_stock) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt index ae7c44e9b146..8b9ae9a0606d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt @@ -39,7 +39,7 @@ class EditTileListStateTest : SysuiTestCase() { @Test fun startDrag_listHasSpacers() { - underTest.onStarted(TestEditTiles[0]) + underTest.onStarted(TestEditTiles[0], DragType.Add) // [ a ] [ b ] [ c ] [ X ] // [ Large D ] [ e ] [ X ] @@ -51,8 +51,8 @@ class EditTileListStateTest : SysuiTestCase() { @Test fun moveDrag_listChanges() { - underTest.onStarted(TestEditTiles[4]) - underTest.onMoved(3, false) + underTest.onStarted(TestEditTiles[4], DragType.Add) + underTest.onTargeting(3, false) // Tile E goes to index 3 // [ a ] [ b ] [ c ] [ e ] @@ -65,8 +65,8 @@ class EditTileListStateTest : SysuiTestCase() { fun moveDragOnSidesOfLargeTile_listChanges() { val draggedCell = TestEditTiles[4] - underTest.onStarted(draggedCell) - underTest.onMoved(4, true) + underTest.onStarted(draggedCell, DragType.Add) + underTest.onTargeting(4, true) // Tile E goes to the right side of tile D, list is unchanged // [ a ] [ b ] [ c ] [ X ] @@ -74,7 +74,7 @@ class EditTileListStateTest : SysuiTestCase() { assertThat(underTest.tiles.toStrings()) .isEqualTo(listOf("a", "b", "c", "spacer", "d", "e", "spacer")) - underTest.onMoved(4, false) + underTest.onTargeting(4, false) // Tile E goes to the left side of tile D, they swap positions // [ a ] [ b ] [ c ] [ e ] @@ -87,8 +87,8 @@ class EditTileListStateTest : SysuiTestCase() { fun moveNewTile_tileIsAdded() { val newTile = createEditTile("newTile", 2) - underTest.onStarted(newTile) - underTest.onMoved(5, false) + underTest.onStarted(newTile, DragType.Add) + underTest.onTargeting(5, false) // New tile goes to index 5 // [ a ] [ b ] [ c ] [ X ] @@ -102,7 +102,7 @@ class EditTileListStateTest : SysuiTestCase() { @Test fun movedTileOutOfBounds_tileDisappears() { - underTest.onStarted(TestEditTiles[0]) + underTest.onStarted(TestEditTiles[0], DragType.Add) underTest.movedOutOfBounds() assertThat(underTest.tiles.toStrings()).doesNotContain(TestEditTiles[0].tile.tileSpec.spec) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt index 583db722a759..bbfa7e7a81ee 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt @@ -21,6 +21,7 @@ import android.content.ComponentName import android.graphics.drawable.TestStubDrawable import android.platform.test.flag.junit.FlagsParameterization import androidx.test.filters.SmallTest +import com.android.internal.logging.uiEventLoggerFake import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.common.shared.model.ContentDescription @@ -29,9 +30,12 @@ import com.android.systemui.common.shared.model.Text import com.android.systemui.common.ui.compose.toAnnotatedString import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.runCurrent +import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.qs.FakeQSFactory import com.android.systemui.qs.FakeQSTile +import com.android.systemui.qs.QSEditEvent import com.android.systemui.qs.panels.data.repository.stockTilesRepository import com.android.systemui.qs.panels.domain.interactor.FakeTileAvailabilityInteractor import com.android.systemui.qs.panels.domain.interactor.tileAvailabilityInteractorsMap @@ -42,8 +46,10 @@ import com.android.systemui.qs.pipeline.data.repository.fakeInstalledTilesReposi import com.android.systemui.qs.pipeline.data.repository.fakeMinimumTilesRepository import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.pipeline.shared.metricSpec import com.android.systemui.qs.qsTileFactory import com.android.systemui.qs.shared.model.TileCategory +import com.android.systemui.qs.tiles.impl.airplane.qsAirplaneModeTileConfig import com.android.systemui.qs.tiles.impl.alarm.qsAlarmTileConfig import com.android.systemui.qs.tiles.impl.battery.qsBatterySaverTileConfig import com.android.systemui.qs.tiles.impl.flashlight.qsFlashlightTileConfig @@ -86,6 +92,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { qsFlashlightTileConfig, qsBatterySaverTileConfig, qsAlarmTileConfig, + qsAirplaneModeTileConfig, qsCameraSensorPrivacyToggleTileConfig, qsMicrophoneSensorPrivacyToggleTileConfig, ) @@ -116,7 +123,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { fakeInstalledTilesRepository.setInstalledServicesForUser( userTracker.userId, - listOf(serviceInfo1, serviceInfo2) + listOf(serviceInfo1, serviceInfo2), ) with(fakeQSTileConfigProvider) { configs.forEach { putConfig(it.tileSpec, it) } } @@ -424,10 +431,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { testScope.runTest { val tiles by collectLastValue(underTest.tiles) val currentTiles = - mutableListOf( - TileSpec.create("flashlight"), - TileSpec.create("airplane"), - ) + mutableListOf(TileSpec.create("flashlight"), TileSpec.create("airplane")) currentTilesInteractor.setTiles(currentTiles) assertThat(currentTiles.size).isLessThan(minNumberOfTiles) @@ -549,6 +553,156 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { } } + // UI EVENT TESTS + + @Test + fun startEditing_onlyOneEvent() = + kosmos.runTest { + underTest.startEditing() + underTest.startEditing() + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) + + assertThat(uiEventLoggerFake[0].eventId).isEqualTo(QSEditEvent.QS_EDIT_OPEN.id) + } + + @Test + fun stopEditing_notEditing_noEvent() = + kosmos.runTest { + underTest.stopEditing() + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(0) + } + + @Test + fun stopEditing_whenEditing_correctEvent() = + kosmos.runTest { + underTest.startEditing() + underTest.stopEditing() + + assertThat(uiEventLoggerFake[1].eventId).isEqualTo(QSEditEvent.QS_EDIT_CLOSED.id) + } + + @Test + fun addTile_correctPackageAndPosition() = + kosmos.runTest { + val flashlightTile = TileSpec.create("flashlight") + val airplaneTile = TileSpec.create("airplane") + val internetTile = TileSpec.create("internet") + val customTile = TileSpec.create(component2) + currentTilesInteractor.setTiles(listOf(flashlightTile)) + runCurrent() + + underTest.addTile(airplaneTile) + underTest.addTile(internetTile, position = 0) + underTest.addTile(customTile, position = 1) + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(3) + + with(uiEventLoggerFake[0]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id) + assertThat(packageName).isEqualTo(airplaneTile.metricSpec) + assertThat(position).isEqualTo(-1) + } + with(uiEventLoggerFake[1]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id) + assertThat(packageName).isEqualTo(internetTile.metricSpec) + assertThat(position).isEqualTo(0) + } + with(uiEventLoggerFake[2]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id) + assertThat(packageName).isEqualTo(customTile.metricSpec) + assertThat(position).isEqualTo(1) + } + } + + @Test + fun addTile_alreadyThere_usesMoveEvent() = + kosmos.runTest { + val flashlightTile = TileSpec.create("flashlight") + val airplaneTile = TileSpec.create("airplane") + val internetTile = TileSpec.create("internet") + currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) + runCurrent() + + underTest.addTile(flashlightTile) // adding at the end, should use correct position + underTest.addTile(internetTile, 0) + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(2) + + with(uiEventLoggerFake[0]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_MOVE.id) + assertThat(packageName).isEqualTo(flashlightTile.metricSpec) + // adding at the end, should use correct position + assertThat(position).isEqualTo(2) + } + with(uiEventLoggerFake[1]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_MOVE.id) + assertThat(packageName).isEqualTo(internetTile.metricSpec) + assertThat(position).isEqualTo(0) + } + } + + @Test + fun removeTileEvent() = + kosmos.runTest { + val flashlightTile = TileSpec.create("flashlight") + val airplaneTile = TileSpec.create("airplane") + val internetTile = TileSpec.create("internet") + currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) + runCurrent() + + underTest.removeTile(airplaneTile) + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) + + with(uiEventLoggerFake[0]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_REMOVE.id) + assertThat(packageName).isEqualTo(airplaneTile.metricSpec) + } + } + + @Test + fun setTiles_emitsCorrectOperation_individualOperations() = + kosmos.runTest { + val flashlightTile = TileSpec.create("flashlight") + val airplaneTile = TileSpec.create("airplane") + val internetTile = TileSpec.create("internet") + val alarmTile = TileSpec.create("alarm") + + currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) + runCurrent() + + // 0. Move flashlightTile to position 2 + underTest.setTiles(listOf(airplaneTile, internetTile, flashlightTile)) + runCurrent() + + // 1. Add alarm tile at position 1 + underTest.setTiles(listOf(airplaneTile, alarmTile, internetTile, flashlightTile)) + runCurrent() + + // 2. Remove internetTile + underTest.setTiles(listOf(airplaneTile, alarmTile, flashlightTile)) + runCurrent() + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(3) + + with(uiEventLoggerFake[0]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_MOVE.id) + assertThat(packageName).isEqualTo(flashlightTile.metricSpec) + assertThat(position).isEqualTo(2) + } + with(uiEventLoggerFake[1]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id) + assertThat(packageName).isEqualTo(alarmTile.metricSpec) + assertThat(position).isEqualTo(1) + } + with(uiEventLoggerFake[2]) { + assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_REMOVE.id) + assertThat(packageName).isEqualTo(internetTile.metricSpec) + } + } + companion object { private val drawable1 = TestStubDrawable("drawable1") private val appName1 = "App1" diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt index 869ab6c24fce..1fc1c0fd1e6b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt @@ -85,6 +85,24 @@ class TileSpecTest : SysuiTestCase() { assertThat(TileSpec.create("")).isEqualTo(TileSpec.Invalid) } + @Test + fun metricSpec_invalid() { + assertThat(TileSpec.Invalid.metricSpec).isEmpty() + } + + @Test + fun metricSpec_platform_specName() { + val tile = "spec" + assertThat(TileSpec.create(tile).metricSpec).isEqualTo(tile) + } + + @Test + fun metricSpec_custom_packageName() { + val componentName = ComponentName("test_pkg", "test_cls") + + assertThat(TileSpec.create(componentName).metricSpec).isEqualTo(componentName.packageName) + } + companion object { private const val CUSTOM_TILE_PREFIX = "custom(" } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DataSaverTileTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DataSaverTileTest.kt index 27fd2818ea88..fbbdc46a7873 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DataSaverTileTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DataSaverTileTest.kt @@ -46,6 +46,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.MockitoAnnotations +import org.mockito.kotlin.eq import platform.test.runner.parameterized.ParameterizedAndroidJunit4 import platform.test.runner.parameterized.Parameters @@ -79,7 +80,7 @@ class DataSaverTileTest(flags: FlagsParameterization) : SysuiTestCase() { testableLooper = TestableLooper.get(this) whenever(mHost.context).thenReturn(mContext) - whenever(systemUIDialogFactory.create()).thenReturn(systemUIDialog) + whenever(systemUIDialogFactory.create(eq(mContext))).thenReturn(systemUIDialog) tile = DataSaverTile( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt index 9e4cf94df3de..0bb86da5d955 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt @@ -141,7 +141,7 @@ class DeviceControlsTileTest(flags: FlagsParameterization) : SysuiTestCase() { if (featureEnabled) { Optional.of(controlsController) } else { - Optional.empty() + Optional.empty<ControlsController>() } } @@ -149,7 +149,7 @@ class DeviceControlsTileTest(flags: FlagsParameterization) : SysuiTestCase() { if (featureEnabled) { Optional.of(controlsListingController) } else { - Optional.empty() + Optional.empty<ControlsController>() } } @@ -157,7 +157,7 @@ class DeviceControlsTileTest(flags: FlagsParameterization) : SysuiTestCase() { if (featureEnabled) { Optional.of(controlsUiController) } else { - Optional.empty() + Optional.empty<ControlsController>() } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt index ad6c64b32ddc..039a1dc05c79 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt @@ -32,7 +32,6 @@ import com.android.systemui.qs.PseudoGridView import com.android.systemui.qs.QSUserSwitcherEvent import com.android.systemui.qs.tiles.UserDetailView import com.android.systemui.statusbar.phone.SystemUIDialog -import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock @@ -51,31 +50,22 @@ import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any @SmallTest @RunWith(AndroidJUnit4::class) class UserSwitchDialogControllerTest : SysuiTestCase() { - @Mock - private lateinit var dialogFactory: SystemUIDialog.Factory - @Mock - private lateinit var dialog: SystemUIDialog - @Mock - private lateinit var falsingManager: FalsingManager - @Mock - private lateinit var activityStarter: ActivityStarter - @Mock - private lateinit var userDetailViewAdapter: UserDetailView.Adapter - @Mock - private lateinit var launchExpandable: Expandable - @Mock - private lateinit var neutralButton: Button - @Mock - private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator - @Mock - private lateinit var uiEventLogger: UiEventLogger - @Captor - private lateinit var clickCaptor: ArgumentCaptor<DialogInterface.OnClickListener> + @Mock private lateinit var dialogFactory: SystemUIDialog.Factory + @Mock private lateinit var dialog: SystemUIDialog + @Mock private lateinit var falsingManager: FalsingManager + @Mock private lateinit var activityStarter: ActivityStarter + @Mock private lateinit var userDetailViewAdapter: UserDetailView.Adapter + @Mock private lateinit var launchExpandable: Expandable + @Mock private lateinit var neutralButton: Button + @Mock private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator + @Mock private lateinit var uiEventLogger: UiEventLogger + @Captor private lateinit var clickCaptor: ArgumentCaptor<DialogInterface.OnClickListener> private lateinit var controller: UserSwitchDialogController @@ -84,16 +74,17 @@ class UserSwitchDialogControllerTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) whenever(dialog.context).thenReturn(mContext) - whenever(dialogFactory.create()).thenReturn(dialog) - - controller = UserSwitchDialogController( - { userDetailViewAdapter }, - activityStarter, - falsingManager, - mDialogTransitionAnimator, - uiEventLogger, - dialogFactory - ) + whenever(dialogFactory.create(eq(mContext))).thenReturn(dialog) + + controller = + UserSwitchDialogController( + { userDetailViewAdapter }, + activityStarter, + falsingManager, + mDialogTransitionAnimator, + uiEventLogger, + dialogFactory, + ) } @Test @@ -150,7 +141,7 @@ class UserSwitchDialogControllerTest : SysuiTestCase() { .postStartActivityDismissingKeyguard( argThat(IntentMatcher(Settings.ACTION_USER_SETTINGS)), eq(0), - eq(null) + eq(null), ) verify(uiEventLogger).log(QSUserSwitcherEvent.QS_USER_MORE_SETTINGS) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt index ef1ae093bcc9..fd9f5f02ee62 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt @@ -25,6 +25,7 @@ import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues import com.android.systemui.display.data.repository.display import com.android.systemui.display.data.repository.displayRepository +import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.testKosmos @@ -38,17 +39,31 @@ import org.junit.runner.RunWith class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() { private val kosmos = testKosmos().useUnconfinedTestDispatcher() private val testScope = kosmos.testScope + private val keyguardRepository = kosmos.fakeKeyguardRepository private val displayRepository = kosmos.displayRepository - val underTest = StatusBarTouchShadeDisplayPolicy(displayRepository, testScope.backgroundScope) + + private fun createUnderTest( + shadeOnDefaultDisplayWhenLocked: Boolean = false + ): StatusBarTouchShadeDisplayPolicy { + return StatusBarTouchShadeDisplayPolicy( + displayRepository, + keyguardRepository, + testScope.backgroundScope, + shadeOnDefaultDisplayWhenLocked = shadeOnDefaultDisplayWhenLocked, + ) + } @Test fun displayId_defaultToDefaultDisplay() { + val underTest = createUnderTest() + assertThat(underTest.displayId.value).isEqualTo(Display.DEFAULT_DISPLAY) } @Test fun onStatusBarTouched_called_updatesDisplayId() = testScope.runTest { + val underTest = createUnderTest() val displayId by collectLastValue(underTest.displayId) displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL)) @@ -60,6 +75,7 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() { @Test fun onStatusBarTouched_notExistentDisplay_displayIdNotUpdated() = testScope.runTest { + val underTest = createUnderTest() val displayIds by collectValues(underTest.displayId) assertThat(displayIds).isEqualTo(listOf(Display.DEFAULT_DISPLAY)) @@ -72,6 +88,7 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() { @Test fun onStatusBarTouched_afterDisplayRemoved_goesBackToDefaultDisplay() = testScope.runTest { + val underTest = createUnderTest() val displayId by collectLastValue(underTest.displayId) displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL)) @@ -83,4 +100,40 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() { assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY) } + + @Test + fun onStatusBarTouched_afterKeyguardVisible_goesBackToDefaultDisplay() = + testScope.runTest { + val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true) + val displayId by collectLastValue(underTest.displayId) + + displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL)) + underTest.onStatusBarTouched(2) + + assertThat(displayId).isEqualTo(2) + + keyguardRepository.setKeyguardShowing(true) + + assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY) + } + + @Test + fun onStatusBarTouched_afterKeyguardHides_goesBackToPreviousDisplay() = + testScope.runTest { + val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true) + val displayId by collectLastValue(underTest.displayId) + + displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL)) + underTest.onStatusBarTouched(2) + + assertThat(displayId).isEqualTo(2) + + keyguardRepository.setKeyguardShowing(true) + + assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY) + + keyguardRepository.setKeyguardShowing(false) + + assertThat(displayId).isEqualTo(2) + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt index a8d5c31873de..e93d0effe742 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt @@ -16,32 +16,26 @@ package com.android.systemui.shade.domain.interactor -import android.content.mockedContext import android.content.res.Configuration import android.content.res.mockResources import android.view.Display -import android.view.mockWindowManager import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.scene.ui.view.mockShadeRootView import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository import com.android.systemui.testKosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.advanceUntilIdle import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mockito.inOrder +import org.mockito.Mockito.never +import org.mockito.Mockito.verify import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock -import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever -@OptIn(ExperimentalCoroutinesApi::class) @RunWith(AndroidJUnit4::class) @SmallTest class ShadeDisplaysInteractorTest : SysuiTestCase() { @@ -49,9 +43,7 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { private val shadeRootview = kosmos.mockShadeRootView private val positionRepository = kosmos.fakeShadeDisplaysRepository - private val shadeContext = kosmos.mockedContext - private val testScope = kosmos.testScope - private val shadeWm = kosmos.mockWindowManager + private val shadeContext = kosmos.mockedWindowContext private val resources = kosmos.mockResources private val configuration = mock<Configuration>() private val display = mock<Display>() @@ -66,8 +58,8 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { whenever(resources.configuration).thenReturn(configuration) whenever(shadeContext.displayId).thenReturn(0) - whenever(shadeContext.getSystemService(any())).thenReturn(shadeWm) whenever(shadeContext.resources).thenReturn(resources) + whenever(shadeContext.display).thenReturn(display) } @Test @@ -77,7 +69,7 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { underTest.start() - verifyNoMoreInteractions(shadeWm) + verify(shadeContext, never()).reparentToDisplay(any()) } @Test @@ -87,24 +79,6 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { underTest.start() - inOrder(shadeWm).apply { - verify(shadeWm).removeView(eq(shadeRootview)) - verify(shadeWm).addView(eq(shadeRootview), any()) - } - } - - @Test - fun start_shadePositionChanges_removedThenAdded() { - whenever(display.displayId).thenReturn(0) - positionRepository.setDisplayId(0) - underTest.start() - - positionRepository.setDisplayId(1) - testScope.advanceUntilIdle() - - inOrder(shadeWm).apply { - verify(shadeWm).removeView(eq(shadeRootview)) - verify(shadeWm).addView(eq(shadeRootview), any()) - } + verify(shadeContext).reparentToDisplay(eq(1)) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractorTest.kt index 611318acde96..dea3d1f68ce5 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractorTest.kt @@ -197,7 +197,7 @@ class MediaProjectionChipInteractorTest : SysuiTestCase() { if ( (it.arguments[0] as Intent).`package` == CAST_TO_OTHER_DEVICES_PACKAGE ) { - emptyList() + emptyList<ResolveInfo>() } else { listOf(mock<ResolveInfo>()) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt index f06bab756acc..63efc55e1a09 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.chips.notification.domain.model.NotificationChipModel import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.statusbar.notification.data.model.activeNotificationModel +import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import org.junit.Test @@ -46,7 +47,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { kosmos.runTest { val icon = mock<StatusBarIconView>() val startingNotif = - activeNotificationModel(key = "notif1", statusBarChipIcon = icon, whenTime = 5432) + activeNotificationModel( + key = "notif1", + statusBarChipIcon = icon, + whenTime = 5432, + promotedContent = PROMOTED_CONTENT, + ) val underTest = factory.create(startingNotif) @@ -63,7 +69,11 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { val originalIconView = mock<StatusBarIconView>() val underTest = factory.create( - activeNotificationModel(key = "notif1", statusBarChipIcon = originalIconView) + activeNotificationModel( + key = "notif1", + statusBarChipIcon = originalIconView, + promotedContent = PROMOTED_CONTENT, + ) ) val latest by collectLastValue(underTest.notificationChip) @@ -74,6 +84,7 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { key = "notif1", statusBarChipIcon = newIconView, whenTime = 6543, + promotedContent = PROMOTED_CONTENT, ) ) @@ -88,14 +99,22 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { val originalIconView = mock<StatusBarIconView>() val underTest = factory.create( - activeNotificationModel(key = "notif1", statusBarChipIcon = originalIconView) + activeNotificationModel( + key = "notif1", + statusBarChipIcon = originalIconView, + promotedContent = PROMOTED_CONTENT, + ) ) val latest by collectLastValue(underTest.notificationChip) val newIconView = mock<StatusBarIconView>() underTest.setNotification( - activeNotificationModel(key = "other_notif", statusBarChipIcon = newIconView) + activeNotificationModel( + key = "other_notif", + statusBarChipIcon = newIconView, + promotedContent = PROMOTED_CONTENT, + ) ) assertThat(latest!!.key).isEqualTo("notif1") @@ -103,10 +122,43 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { } @Test + fun notificationChip_ignoresSetWithNullPromotedContent() = + kosmos.runTest { + val originalIconView = mock<StatusBarIconView>() + val underTest = + factory.create( + activeNotificationModel( + key = "notif1", + statusBarChipIcon = originalIconView, + promotedContent = PROMOTED_CONTENT, + ) + ) + + val latest by collectLastValue(underTest.notificationChip) + + val newIconView = mock<StatusBarIconView>() + underTest.setNotification( + activeNotificationModel( + key = "notif1", + statusBarChipIcon = newIconView, + promotedContent = null, + ) + ) + + assertThat(latest!!.statusBarChipIconView).isEqualTo(originalIconView) + } + + @Test fun notificationChip_missingStatusBarIconChipView_inConstructor_emitsNull() = kosmos.runTest { val underTest = - factory.create(activeNotificationModel(key = "notif1", statusBarChipIcon = null)) + factory.create( + activeNotificationModel( + key = "notif1", + statusBarChipIcon = null, + promotedContent = PROMOTED_CONTENT, + ) + ) val latest by collectLastValue(underTest.notificationChip) @@ -123,6 +175,7 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { key = "notif1", statusBarChipIcon = null, whenTime = 123L, + promotedContent = PROMOTED_CONTENT, ) ) @@ -130,20 +183,34 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { assertThat(latest) .isEqualTo( - NotificationChipModel("notif1", statusBarChipIconView = null, whenTime = 123L) + NotificationChipModel( + "notif1", + statusBarChipIconView = null, + whenTime = 123L, + promotedContent = PROMOTED_CONTENT, + ) ) } @Test fun notificationChip_missingStatusBarIconChipView_inSet_emitsNull() = kosmos.runTest { - val startingNotif = activeNotificationModel(key = "notif1", statusBarChipIcon = mock()) + val startingNotif = + activeNotificationModel( + key = "notif1", + statusBarChipIcon = mock(), + promotedContent = PROMOTED_CONTENT, + ) val underTest = factory.create(startingNotif) val latest by collectLastValue(underTest.notificationChip) assertThat(latest).isNotNull() underTest.setNotification( - activeNotificationModel(key = "notif1", statusBarChipIcon = null) + activeNotificationModel( + key = "notif1", + statusBarChipIcon = null, + promotedContent = PROMOTED_CONTENT, + ) ) assertThat(latest).isNull() @@ -153,13 +220,23 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME) fun notificationChip_missingStatusBarIconChipView_inSet_cdEnabled_emitsNotNull() = kosmos.runTest { - val startingNotif = activeNotificationModel(key = "notif1", statusBarChipIcon = mock()) + val startingNotif = + activeNotificationModel( + key = "notif1", + statusBarChipIcon = mock(), + promotedContent = PROMOTED_CONTENT, + ) val underTest = factory.create(startingNotif) val latest by collectLastValue(underTest.notificationChip) assertThat(latest).isNotNull() underTest.setNotification( - activeNotificationModel(key = "notif1", statusBarChipIcon = null, whenTime = 123L) + activeNotificationModel( + key = "notif1", + statusBarChipIcon = null, + whenTime = 123L, + promotedContent = PROMOTED_CONTENT, + ) ) assertThat(latest) @@ -168,8 +245,26 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { key = "notif1", statusBarChipIconView = null, whenTime = 123L, + promotedContent = PROMOTED_CONTENT, + ) + ) + } + + @Test + fun notificationChip_missingPromotedContent_inConstructor_emitsNull() = + kosmos.runTest { + val underTest = + factory.create( + activeNotificationModel( + key = "notif1", + statusBarChipIcon = mock(), + promotedContent = null, ) ) + + val latest by collectLastValue(underTest.notificationChip) + + assertThat(latest).isNull() } @Test @@ -179,7 +274,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { val underTest = factory.create( - activeNotificationModel(key = "notif", uid = UID, statusBarChipIcon = mock()) + activeNotificationModel( + key = "notif", + uid = UID, + statusBarChipIcon = mock(), + promotedContent = PROMOTED_CONTENT, + ) ) val latest by collectLastValue(underTest.notificationChip) @@ -194,7 +294,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { val underTest = factory.create( - activeNotificationModel(key = "notif", uid = UID, statusBarChipIcon = mock()) + activeNotificationModel( + key = "notif", + uid = UID, + statusBarChipIcon = mock(), + promotedContent = PROMOTED_CONTENT, + ) ) val latest by collectLastValue(underTest.notificationChip) @@ -207,7 +312,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { kosmos.runTest { val underTest = factory.create( - activeNotificationModel(key = "notif", uid = UID, statusBarChipIcon = mock()) + activeNotificationModel( + key = "notif", + uid = UID, + statusBarChipIcon = mock(), + promotedContent = PROMOTED_CONTENT, + ) ) val latest by collectLastValue(underTest.notificationChip) @@ -239,6 +349,7 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { key = "notif", uid = hiddenUid, statusBarChipIcon = mock(), + promotedContent = PROMOTED_CONTENT, ) ) val latest by collectLastValue(underTest.notificationChip) @@ -247,7 +358,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { // WHEN the notif gets a new UID that starts as visible activityManagerRepository.fake.startingIsAppVisibleValue = true underTest.setNotification( - activeNotificationModel(key = "notif", uid = shownUid, statusBarChipIcon = mock()) + activeNotificationModel( + key = "notif", + uid = shownUid, + statusBarChipIcon = mock(), + promotedContent = PROMOTED_CONTENT, + ) ) // THEN we re-fetch the app visibility state with the new UID, and since that UID is @@ -257,5 +373,6 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() { companion object { private const val UID = 885 + private val PROMOTED_CONTENT = PromotedNotificationContentModel.Builder("notif1").build() } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt index 8a4ddceb0d3a..d4910cec3df4 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt @@ -22,22 +22,30 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository +import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runTest +import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.chips.notification.domain.interactor.statusBarNotificationChipsInteractor import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips +import com.android.systemui.statusbar.chips.ui.model.ColorsModel import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.statusbar.notification.data.model.activeNotificationModel import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore +import com.android.systemui.statusbar.notification.data.repository.UnconfinedFakeHeadsUpRowRepository import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository +import com.android.systemui.statusbar.notification.headsup.PinnedStatus import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel +import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlin.test.Test +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.runner.RunWith @@ -47,7 +55,12 @@ import org.mockito.kotlin.mock @RunWith(AndroidJUnit4::class) @EnableFlags(StatusBarNotifChips.FLAG_NAME) class NotifChipsViewModelTest : SysuiTestCase() { - private val kosmos = testKosmos().useUnconfinedTestDispatcher() + private val kosmos = + testKosmos().useUnconfinedTestDispatcher().apply { + // Don't be in lockscreen so that HUNs are allowed + fakeKeyguardTransitionRepository = + FakeKeyguardTransitionRepository(initInLockscreen = false, testScope = testScope) + } private val activeNotificationListRepository = kosmos.activeNotificationListRepository private val underTest by lazy { kosmos.notifChipsViewModel } @@ -132,6 +145,36 @@ class NotifChipsViewModelTest : SysuiTestCase() { } @Test + fun chips_onePromotedNotif_colorMatches() = + kosmos.runTest { + val latest by collectLastValue(underTest.chips) + + val promotedContentBuilder = + PromotedNotificationContentModel.Builder("notif").apply { + this.colors = + PromotedNotificationContentModel.Colors( + backgroundColor = 56, + primaryTextColor = 89, + ) + } + setNotifs( + listOf( + activeNotificationModel( + key = "notif", + statusBarChipIcon = mock<StatusBarIconView>(), + promotedContent = promotedContentBuilder.build(), + ) + ) + ) + + assertThat(latest).hasSize(1) + val colors = latest!![0].colors + assertThat(colors).isInstanceOf(ColorsModel.Custom::class.java) + assertThat((colors as ColorsModel.Custom).backgroundColorInt).isEqualTo(56) + assertThat((colors as ColorsModel.Custom).primaryTextColorInt).isEqualTo(89) + } + + @Test fun chips_onlyForPromotedNotifs() = kosmos.runTest { val latest by collectLastValue(underTest.chips) @@ -199,6 +242,54 @@ class NotifChipsViewModelTest : SysuiTestCase() { } @Test + fun chips_noHeadsUp_showsTime() = + kosmos.runTest { + val latest by collectLastValue(underTest.chips) + setNotifs( + listOf( + activeNotificationModel( + key = "notif", + statusBarChipIcon = mock<StatusBarIconView>(), + promotedContent = PromotedNotificationContentModel.Builder("notif").build(), + ) + ) + ) + + // WHEN there's no HUN + kosmos.headsUpNotificationRepository.setNotifications(emptyList()) + + // THEN the chip shows the time + assertThat(latest!![0]) + .isInstanceOf(OngoingActivityChipModel.Shown.ShortTimeDelta::class.java) + } + + @Test + fun chips_hasHeadsUpByUser_onlyShowsIcon() = + kosmos.runTest { + val latest by collectLastValue(underTest.chips) + setNotifs( + listOf( + activeNotificationModel( + key = "notif", + statusBarChipIcon = mock<StatusBarIconView>(), + promotedContent = PromotedNotificationContentModel.Builder("notif").build(), + ) + ) + ) + + // WHEN there's a HUN pinned by a user + kosmos.headsUpNotificationRepository.setNotifications( + UnconfinedFakeHeadsUpRowRepository( + key = "notif", + pinnedStatus = MutableStateFlow(PinnedStatus.PinnedByUser), + ) + ) + + assertThat(latest!![0]) + .isInstanceOf(OngoingActivityChipModel.Shown.IconOnly::class.java) + } + + @Test fun chips_clickingChipNotifiesInteractor() = kosmos.runTest { val latest by collectLastValue(underTest.chips) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt index 1d7f25784327..a3ffd91b1728 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt @@ -50,7 +50,6 @@ import com.android.systemui.statusbar.notification.interruption.NotificationInte import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderWrapper.DecisionImpl import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderWrapper.FullScreenIntentDecisionImpl import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider -import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback import com.android.systemui.statusbar.phone.NotificationGroupTestHelper import com.android.systemui.testKosmos import com.android.systemui.util.concurrency.FakeExecutor @@ -76,6 +75,7 @@ import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations +import org.mockito.kotlin.argumentCaptor @SmallTest @RunWith(AndroidJUnit4::class) @@ -315,7 +315,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // WHEN the notification is added but not yet binding collectionListener.onEntryAdded(entry) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any(), any()) // THEN only promote mEntry assertTrue(notifPromoter.shouldPromoteToTopLevel(entry)) @@ -330,7 +330,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { collectionListener.onEntryAdded(entry) beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry)) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) - verify(headsUpViewBinder).bindHeadsUpView(eq(entry), any()) + verify(headsUpViewBinder).bindHeadsUpView(eq(entry), eq(false), any()) // THEN only promote mEntry assertTrue(notifPromoter.shouldPromoteToTopLevel(entry)) @@ -382,11 +382,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { collectionListener.onEntryAdded(entry) beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry)) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) - verify(headsUpManager, never()).showNotification(entry) - withArgCaptor<BindCallback> { - verify(headsUpViewBinder).bindHeadsUpView(eq(entry), capture()) - } - .onBindFinished(entry) + + finishBind(entry) // THEN we tell the HeadsUpManager to show the notification verify(headsUpManager).showNotification(entry) @@ -401,8 +398,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) // THEN we never bind the heads up view or tell HeadsUpManager to show the notification - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any()) - verify(headsUpManager, never()).showNotification(entry) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any(), any()) + verify(headsUpManager, never()).showNotification(eq(entry), any()) } @Test @@ -435,8 +432,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) // THEN the notification is never bound or shown - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) - verify(headsUpManager, never()).showNotification(any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) + verify(headsUpManager, never()).showNotification(any(), any()) } @Test @@ -471,7 +468,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) finishBind(entry) - verify(headsUpManager).showNotification(entry) + verify(headsUpManager).showNotification(entry, isPinnedByUser = true) } @Test @@ -485,8 +482,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { executor.runAllReady() beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any()) - verify(headsUpManager, never()).showNotification(entry) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any(), any()) + verify(headsUpManager, never()).showNotification(eq(entry), any()) } @Test @@ -509,7 +506,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN it's still shown as heads up finishBind(entry) - verify(headsUpManager).showNotification(entry) + verify(headsUpManager).showNotification(entry, isPinnedByUser = true) } @Test @@ -525,8 +522,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { beforeTransformGroupsListener.onBeforeTransformGroups(listOf(promotedEntry)) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(promotedEntry)) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(promotedEntry), any()) - verify(headsUpManager, never()).showNotification(promotedEntry) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(promotedEntry), any(), any()) + verify(headsUpManager, never()).showNotification(eq(promotedEntry), any()) // Then a new notification comes in that should be heads up setShouldHeadsUp(entry, false) @@ -544,10 +541,10 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN the promoted entry is shown as a HUN, *not* the new entry finishBind(promotedEntry) - verify(headsUpManager).showNotification(promotedEntry) + verify(headsUpManager).showNotification(promotedEntry, isPinnedByUser = true) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any()) - verify(headsUpManager, never()).showNotification(entry) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any(), any()) + verify(headsUpManager, never()).showNotification(eq(entry), any()) } @Test @@ -558,10 +555,10 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { collectionListener.onEntryAdded(groupSummary) collectionListener.onEntryAdded(groupSibling1) beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupSibling1)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupSibling1)) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupSibling1) verify(headsUpManager, never()).showNotification(groupSummary) @@ -580,10 +577,10 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { collectionListener.onEntryAdded(groupSummary) collectionListener.onEntryAdded(groupChild1) beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupChild1)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupChild1)) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupChild1) verify(headsUpManager, never()).showNotification(groupSummary) @@ -603,12 +600,12 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { collectionListener.onEntryAdded(groupSibling2) val entryList = listOf(groupSibling1, groupSibling2) beforeTransformGroupsListener.onBeforeTransformGroups(entryList) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) beforeFinalizeFilterListener.onBeforeFinalizeFilter(entryList) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupSibling1) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any(), any()) // THEN we tell the HeadsUpManager to show the notification verify(headsUpManager, never()).showNotification(groupSummary) @@ -629,12 +626,12 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { collectionListener.onEntryAdded(groupChild2) val entryList = listOf(groupChild1, groupChild2) beforeTransformGroupsListener.onBeforeTransformGroups(entryList) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) beforeFinalizeFilterListener.onBeforeFinalizeFilter(entryList) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupChild1) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any(), any()) // THEN we tell the HeadsUpManager to show the notification verify(headsUpManager, never()).showNotification(groupSummary) @@ -661,7 +658,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { .setChildren(listOf(groupSibling1, groupPriority, groupSibling2)) .build() beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) val afterTransformGroup = GroupEntryBuilder() @@ -672,10 +669,10 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { listOf(groupPriority, afterTransformGroup) ) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupPriority) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any(), any()) // THEN we tell the HeadsUpManager to show the notification verify(headsUpManager, never()).showNotification(groupSummary) @@ -702,7 +699,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { .setChildren(listOf(groupSibling1, groupPriority, groupSibling2)) .build() beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) val afterTransformGroup = GroupEntryBuilder() @@ -713,10 +710,10 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { listOf(groupPriority, afterTransformGroup) ) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupPriority) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any(), any()) verify(headsUpManager, never()).showNotification(groupSummary) verify(headsUpManager).showNotification(groupPriority) @@ -740,7 +737,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { .setChildren(listOf(groupSibling1, groupPriority, groupSibling2)) .build() beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) val afterTransformGroup = GroupEntryBuilder() @@ -751,10 +748,10 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { listOf(groupPriority, afterTransformGroup) ) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupPriority) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any(), any()) verify(headsUpManager, never()).showNotification(groupSummary) verify(headsUpManager).showNotification(groupPriority) @@ -779,7 +776,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { .setChildren(listOf(groupSibling1, groupPriority, groupSibling2)) .build() beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) val afterTransformGroup = GroupEntryBuilder() @@ -791,9 +788,9 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { ) finishBind(groupSummary) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupPriority), any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupPriority), any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any(), any()) verify(headsUpManager).showNotification(groupSummary) verify(headsUpManager, never()).showNotification(groupPriority) @@ -816,12 +813,12 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { .setChildren(listOf(groupSibling1, groupSibling2)) .build() beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry)) finishBind(groupSummary) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any(), any()) verify(headsUpManager).showNotification(groupSummary) verify(headsUpManager, never()).showNotification(groupSibling1) @@ -842,12 +839,12 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { .setChildren(listOf(groupChild1, groupChild2)) .build() beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry)) finishBind(groupSummary) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild1), any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild1), any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any(), any()) verify(headsUpManager).showNotification(groupSummary) verify(headsUpManager, never()).showNotification(groupChild1) @@ -871,12 +868,12 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { .setChildren(listOf(groupChild1, groupChild2)) .build() beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry)) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry)) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any(), any()) finishBind(groupChild1) - verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any(), any()) verify(headsUpManager, never()).showNotification(groupSummary) verify(headsUpManager).showNotification(groupChild1) @@ -900,7 +897,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN the notification is shown finishBind(entry) - verify(headsUpManager).showNotification(entry) + verify(headsUpManager).showNotification(entry, isPinnedByUser = false) } @Test @@ -917,8 +914,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) // THEN the notification is never bound or shown - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) - verify(headsUpManager, never()).showNotification(any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) + verify(headsUpManager, never()).showNotification(any(), any()) } @Test @@ -938,7 +935,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN the notification is shown finishBind(entry) - verify(headsUpManager).showNotification(entry) + verify(headsUpManager).showNotification(entry, isPinnedByUser = false) } @Test @@ -958,8 +955,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry)) // THEN the notification is never bound or shown - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) - verify(headsUpManager, never()).showNotification(any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) + verify(headsUpManager, never()).showNotification(any(), any()) } @Test @@ -1022,8 +1019,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN it should full screen and log but it should NOT HUN verify(launchFullScreenIntentProvider).launchFullScreenIntent(entry) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) - verify(headsUpManager, never()).showNotification(any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) + verify(headsUpManager, never()).showNotification(any(), any()) verifyLoggedFullScreenIntentDecision( entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE, @@ -1063,8 +1060,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN it should still not yet full screen or HUN verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) - verify(headsUpManager, never()).showNotification(any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) + verify(headsUpManager, never()).showNotification(any(), any()) // Same decision as before; is not logged verifyNoFullScreenIntentDecisionLogged() @@ -1080,8 +1077,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN it should full screen and log but it should NOT HUN verify(launchFullScreenIntentProvider).launchFullScreenIntent(entry) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) - verify(headsUpManager, never()).showNotification(any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) + verify(headsUpManager, never()).showNotification(any(), any()) verifyLoggedFullScreenIntentDecision( entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE, @@ -1107,8 +1104,8 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // THEN it should NOT full screen or HUN verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any()) - verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any()) - verify(headsUpManager, never()).showNotification(any()) + verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any(), any()) + verify(headsUpManager, never()).showNotification(any(), any()) // NOW the DND logic changes and FSI and HUN are available clearInvocations(launchFullScreenIntentProvider) @@ -1121,7 +1118,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { // VERIFY that the FSI didn't happen, but that we do HUN verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any()) finishBind(entry) - verify(headsUpManager).showNotification(entry) + verify(headsUpManager).showNotification(entry, isPinnedByUser = false) } @Test @@ -1206,10 +1203,12 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { } private fun finishBind(entry: NotificationEntry) { - verify(headsUpManager, never()).showNotification(entry) - withArgCaptor<BindCallback> { - verify(headsUpViewBinder).bindHeadsUpView(eq(entry), capture()) + verify(headsUpManager, never()).showNotification(eq(entry), any()) + val isPinnedByUserCaptor = argumentCaptor<Boolean>() + withArgCaptor<HeadsUpViewBinder.HeadsUpBindCallback> { + verify(headsUpViewBinder) + .bindHeadsUpView(eq(entry), isPinnedByUserCaptor.capture(), capture()) } - .onBindFinished(entry) + .onHeadsUpBindFinished(entry, isPinnedByUserCaptor.firstValue) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt index dc0231f40609..22ef408e266c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt @@ -28,6 +28,7 @@ import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepo import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.kosmos.testScope +import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.shadeTestUtil import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository import com.android.systemui.statusbar.notification.data.repository.notificationsKeyguardViewStateRepository @@ -409,76 +410,101 @@ class HeadsUpNotificationInteractorTest : SysuiTestCase() { } @Test - fun showHeadsUpStatusBar_true() = + fun statusBarHeadsUpState_pinnedBySystem() = testScope.runTest { - val showHeadsUpStatusBar by collectLastValue(underTest.showHeadsUpStatusBar) + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) - // WHEN a row is pinned - headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = true)) + headsUpRepository.setNotifications( + FakeHeadsUpRowRepository(key = "key 0", pinnedStatus = PinnedStatus.PinnedBySystem) + ) + runCurrent() - assertThat(showHeadsUpStatusBar).isTrue() + assertThat(statusBarHeadsUpState).isEqualTo(PinnedStatus.PinnedBySystem) } @Test - fun showHeadsUpStatusBar_withoutPinnedNotifications_false() = + fun statusBarHeadsUpState_pinnedByUser() = testScope.runTest { - val showHeadsUpStatusBar by collectLastValue(underTest.showHeadsUpStatusBar) + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) - // WHEN no row is pinned - headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = false)) + headsUpRepository.setNotifications( + FakeHeadsUpRowRepository(key = "key 0", pinnedStatus = PinnedStatus.PinnedByUser) + ) + runCurrent() - assertThat(showHeadsUpStatusBar).isFalse() + assertThat(statusBarHeadsUpState).isEqualTo(PinnedStatus.PinnedByUser) } @Test - fun showHeadsUpStatusBar_whenShadeExpanded_false() = + fun statusBarHeadsUpState_withoutPinnedNotifications_notPinned() = testScope.runTest { - val showHeadsUpStatusBar by collectLastValue(underTest.showHeadsUpStatusBar) + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) + + headsUpRepository.setNotifications( + FakeHeadsUpRowRepository(key = "key 0", PinnedStatus.NotPinned) + ) + runCurrent() + + assertThat(statusBarHeadsUpState).isEqualTo(PinnedStatus.NotPinned) + } + + @Test + fun statusBarHeadsUpState_whenShadeExpanded_false() = + testScope.runTest { + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) // WHEN a row is pinned headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = true)) + runCurrent() // AND the shade is expanded shadeTestUtil.setShadeExpansion(1.0f) + // Needed if SceneContainer flag is off: `ShadeTestUtil.setShadeExpansion(1f)` + // incorrectly causes `ShadeInteractor.isShadeFullyCollapsed` to emit `true`, when it + // should emit `false`. + kosmos.fakeShadeRepository.setLegacyShadeExpansion(1.0f) - assertThat(showHeadsUpStatusBar).isFalse() + assertThat(statusBarHeadsUpState!!.isPinned).isFalse() } @Test - fun showHeadsUpStatusBar_notificationsAreHidden_false() = + fun statusBarHeadsUpState_notificationsAreHidden_false() = testScope.runTest { - val showHeadsUpStatusBar by collectLastValue(underTest.showHeadsUpStatusBar) + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) // WHEN a row is pinned headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = true)) + runCurrent() // AND the notifications are hidden keyguardViewStateRepository.areNotificationsFullyHidden.value = true - assertThat(showHeadsUpStatusBar).isFalse() + assertThat(statusBarHeadsUpState!!.isPinned).isFalse() } @Test - fun showHeadsUpStatusBar_onLockScreen_false() = + fun statusBarHeadsUpState_onLockScreen_false() = testScope.runTest { - val showHeadsUpStatusBar by collectLastValue(underTest.showHeadsUpStatusBar) + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) // WHEN a row is pinned headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = true)) + runCurrent() // AND the lock screen is shown keyguardTransitionRepository.emitInitialStepsFromOff( to = KeyguardState.LOCKSCREEN, testSetup = true, ) - assertThat(showHeadsUpStatusBar).isFalse() + assertThat(statusBarHeadsUpState!!.isPinned).isFalse() } @Test - fun showHeadsUpStatusBar_onByPassLockScreen_true() = + fun statusBarHeadsUpState_onByPassLockScreen_true() = testScope.runTest { - val showHeadsUpStatusBar by collectLastValue(underTest.showHeadsUpStatusBar) + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) // WHEN a row is pinned headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = true)) + runCurrent() // AND the lock screen is shown keyguardTransitionRepository.emitInitialStepsFromOff( to = KeyguardState.LOCKSCREEN, @@ -487,13 +513,13 @@ class HeadsUpNotificationInteractorTest : SysuiTestCase() { // AND bypass is enabled faceAuthRepository.isBypassEnabled.value = true - assertThat(showHeadsUpStatusBar).isTrue() + assertThat(statusBarHeadsUpState!!.isPinned).isTrue() } @Test - fun showHeadsUpStatusBar_onByPassLockScreen_withoutNotifications_false() = + fun statusBarHeadsUpState_onByPassLockScreen_withoutNotifications_false() = testScope.runTest { - val showHeadsUpStatusBar by collectLastValue(underTest.showHeadsUpStatusBar) + val statusBarHeadsUpState by collectLastValue(underTest.statusBarHeadsUpState) // WHEN no pinned rows // AND the lock screen is shown @@ -504,7 +530,7 @@ class HeadsUpNotificationInteractorTest : SysuiTestCase() { // AND bypass is enabled faceAuthRepository.isBypassEnabled.value = true - assertThat(showHeadsUpStatusBar).isFalse() + assertThat(statusBarHeadsUpState!!.isPinned).isFalse() } private fun fakeHeadsUpRowRepository(key: String, isPinned: Boolean = false) = diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java index c9ca67e6af94..615f4b01df9b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java @@ -78,7 +78,7 @@ public class FooterViewTest extends SysuiTestCase { public void setUp() { if (NotifRedesignFooter.isEnabled()) { mView = (FooterView) LayoutInflater.from(mSpyContext).inflate( - R.layout.status_bar_notification_footer_redesign, null, false); + R.layout.notification_2025_footer, null, false); } else { mView = (FooterView) LayoutInflater.from(mSpyContext).inflate( R.layout.status_bar_notification_footer, null, false); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImplTest.kt index 8420c49755b1..98bf0e6170d4 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImplTest.kt @@ -40,6 +40,7 @@ import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.shadeTestUtil import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.provider.visualStabilityProvider @@ -179,6 +180,44 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test + fun pinnedHeadsUpStatuses_noHeadsUp() { + assertThat(underTest.hasPinnedHeadsUp()).isFalse() + assertThat(underTest.pinnedHeadsUpStatus()).isEqualTo(PinnedStatus.NotPinned) + } + + @Test + fun pinnedHeadsUpStatuses_pinnedBySystem() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + entry.row = testHelper.createRow() + underTest.showNotification(entry, isPinnedByUser = false) + + assertThat(underTest.hasPinnedHeadsUp()).isTrue() + assertThat(underTest.pinnedHeadsUpStatus()).isEqualTo(PinnedStatus.PinnedBySystem) + } + + @Test + @DisableFlags(StatusBarNotifChips.FLAG_NAME) + fun pinnedHeadsUpStatuses_pinnedByUser_butFlagOff_returnsNotPinned() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + entry.row = testHelper.createRow() + underTest.showNotification(entry, isPinnedByUser = true) + + assertThat(underTest.hasPinnedHeadsUp()).isFalse() + assertThat(underTest.pinnedHeadsUpStatus()).isEqualTo(PinnedStatus.NotPinned) + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun pinnedHeadsUpStatuses_pinnedByUser_flagOn() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + entry.row = testHelper.createRow() + underTest.showNotification(entry, isPinnedByUser = true) + + assertThat(underTest.hasPinnedHeadsUp()).isTrue() + assertThat(underTest.pinnedHeadsUpStatus()).isEqualTo(PinnedStatus.PinnedByUser) + } + + @Test @EnableFlags(NotificationThrottleHun.FLAG_NAME) fun testGetHeadsUpEntryList_includesAvalancheEntryList() { val notifEntry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) @@ -199,10 +238,10 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test - fun testShowNotification_addsEntry() { + fun testShowNotification_notPinnedByUser_addsEntry() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = false) assertThat(underTest.isHeadsUpEntry(entry.key)).isTrue() assertThat(underTest.hasNotifications()).isTrue() @@ -210,20 +249,43 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test - fun testShowNotification_autoDismisses() { + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testShowNotification_isPinnedByUser_addsEntry() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = true) + + assertThat(underTest.isHeadsUpEntry(entry.key)).isTrue() + assertThat(underTest.hasNotifications()).isTrue() + assertThat(underTest.getEntry(entry.key)).isEqualTo(entry) + } + + @Test + fun testShowNotification_notPinnedByUser_autoDismisses() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + + underTest.showNotification(entry, isPinnedByUser = false) systemClock.advanceTime((TEST_AUTO_DISMISS_TIME * 3 / 2).toLong()) assertThat(underTest.isHeadsUpEntry(entry.key)).isFalse() } @Test - fun testRemoveNotification_removeDeferred() { + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testShowNotification_isPinnedByUser_autoDismisses() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = true) + systemClock.advanceTime((TEST_AUTO_DISMISS_TIME * 3 / 2).toLong()) + + assertThat(underTest.isHeadsUpEntry(entry.key)).isFalse() + } + + @Test + fun testRemoveNotification_notPinnedByUser_removeDeferred() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + + underTest.showNotification(entry, isPinnedByUser = false) val removedImmediately = underTest.removeNotification( @@ -236,10 +298,27 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test - fun testRemoveNotification_forceRemove() { + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testRemoveNotification_isPinnedByUser_removeDeferred() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = true) + + val removedImmediately = + underTest.removeNotification( + entry.key, + /* releaseImmediately= */ false, + "removeDeferred", + ) + assertThat(removedImmediately).isFalse() + assertThat(underTest.isHeadsUpEntry(entry.key)).isTrue() + } + + @Test + fun testRemoveNotification_notPinnedByUser_forceRemove() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + + underTest.showNotification(entry, isPinnedByUser = false) val removedImmediately = underTest.removeNotification(entry.key, /* releaseImmediately= */ true, "forceRemove") @@ -248,11 +327,26 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testRemoveNotification_isPinnedByUser_forceRemove() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + + underTest.showNotification(entry, isPinnedByUser = true) + + val removedImmediately = + underTest.removeNotification(entry.key, /* releaseImmediately= */ true, "forceRemove") + assertThat(removedImmediately).isTrue() + assertThat(underTest.isHeadsUpEntry(entry.key)).isFalse() + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) fun testReleaseAllImmediately() { for (i in 0 until 4) { val entry = HeadsUpManagerTestUtil.createEntry(i, mContext) - entry.row = mock<ExpandableNotificationRow>() - underTest.showNotification(entry) + entry.row = testHelper.createRow() + val isPinnedByUser = i % 2 == 0 + underTest.showNotification(entry, isPinnedByUser) } underTest.releaseAllImmediately() @@ -261,10 +355,21 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test - fun testCanRemoveImmediately_notShownLongEnough() { + fun testCanRemoveImmediately_notShownLongEnough_notPinnedByUser() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = false) + + // The entry has just been added so we should not remove immediately. + assertThat(underTest.canRemoveImmediately(entry.key)).isFalse() + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testCanRemoveImmediately_notShownLongEnough_isPinnedByUser() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + + underTest.showNotification(entry, isPinnedByUser = true) // The entry has just been added so we should not remove immediately. assertThat(underTest.canRemoveImmediately(entry.key)).isFalse() @@ -365,17 +470,48 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test - fun testSnooze() { + fun testSnooze_notPinnedByUser() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = false) + underTest.snooze() + assertThat(underTest.isSnoozed(entry.sbn.packageName)).isTrue() } @Test - fun testSwipedOutNotification() { + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testSnooze_isPinnedByUser() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = true) + + underTest.snooze() + + assertThat(underTest.isSnoozed(entry.sbn.packageName)).isTrue() + } + + @Test + fun testSwipedOutNotification_notPinnedByUser() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + underTest.showNotification(entry, isPinnedByUser = false) + underTest.addSwipedOutNotification(entry.key) + + // Remove should succeed because the notification is swiped out + val removedImmediately = + underTest.removeNotification( + entry.key, + /* releaseImmediately= */ false, + /* reason= */ "swipe out", + ) + assertThat(removedImmediately).isTrue() + assertThat(underTest.isHeadsUpEntry(entry.key)).isFalse() + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testSwipedOutNotification_isPinnedByUser() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + underTest.showNotification(entry, isPinnedByUser = true) underTest.addSwipedOutNotification(entry.key) // Remove should succeed because the notification is swiped out @@ -413,10 +549,24 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { } @Test - fun testExtendHeadsUp() { + fun testExtendHeadsUp_notPinnedByUser() { val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(entry) + underTest.showNotification(entry, isPinnedByUser = false) + + underTest.extendHeadsUp() + + systemClock.advanceTime(((TEST_AUTO_DISMISS_TIME + TEST_EXTENSION_TIME) / 2).toLong()) + assertThat(underTest.isHeadsUpEntry(entry.key)).isTrue() + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun testExtendHeadsUp_isPinnedByUser() { + val entry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) + underTest.showNotification(entry, isPinnedByUser = true) + underTest.extendHeadsUp() + systemClock.advanceTime(((TEST_AUTO_DISMISS_TIME + TEST_EXTENSION_TIME) / 2).toLong()) assertThat(underTest.isHeadsUpEntry(entry.key)).isTrue() } @@ -465,7 +615,7 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { kosmos.visualStabilityProvider.isReorderingAllowed = true val notifEntry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext) - underTest.showNotification(notifEntry) + underTest.showNotification(notifEntry, isPinnedByUser = false) assertThat(notifEntry.isSeenInShade).isFalse() } @@ -604,7 +754,7 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { HeadsUpManagerTestUtil.createFullScreenIntentEntry(/* id= */ 0, mContext) // Add notifEntry to ANM mAlertEntries map and make it NOT unpinned - underTest.showNotification(notifEntry) + underTest.showNotification(notifEntry, isPinnedByUser = false) val headsUpEntry = underTest.getHeadsUpEntry(notifEntry.key) headsUpEntry!!.mWasUnpinned = false @@ -621,7 +771,7 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { HeadsUpManagerTestUtil.createFullScreenIntentEntry(/* id= */ 0, mContext) // Add notifEntry to ANM mAlertEntries map and make it unpinned - underTest.showNotification(notifEntry) + underTest.showNotification(notifEntry, isPinnedByUser = false) val headsUpEntry = underTest.getHeadsUpEntry(notifEntry.key) headsUpEntry!!.mWasUnpinned = true @@ -793,11 +943,11 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { ) // Note: the standard way to show a notification would be calling showNotification rather - // than onAlertEntryAdded. However, in practice showNotification in effect adds + // than onEntryAdded. However, in practice showNotification in effect adds // the notification and then updates it; in order to not log twice, the entry needs // to have a functional ExpandableNotificationRow that can keep track of whether it's // pinned or not (via isRowPinned()). That feels like a lot to pull in to test this one bit. - underTest.onEntryAdded(entryToPin) + underTest.onEntryAdded(entryToPin, /* requestedPinnedStatus= */ PinnedStatus.PinnedBySystem) assertThat(uiEventLoggerFake.numLogs()).isEqualTo(2) assertThat(AvalancheController.ThrottleEvent.AVALANCHE_THROTTLING_HUN_SHOWN.getId()) @@ -816,11 +966,11 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { ) // Note: the standard way to show a notification would be calling showNotification rather - // than onAlertEntryAdded. However, in practice showNotification in effect adds + // than onEntryAdded. However, in practice showNotification in effect adds // the notification and then updates it; in order to not log twice, the entry needs // to have a functional ExpandableNotificationRow that can keep track of whether it's // pinned or not (via isRowPinned()). That feels like a lot to pull in to test this one bit. - underTest.onEntryAdded(entryToPin) + underTest.onEntryAdded(entryToPin, /* requestedPinnedStatus= */ PinnedStatus.PinnedBySystem) assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) assertThat(HeadsUpManagerImpl.NotificationPeekEvent.NOTIFICATION_PEEK.id) @@ -889,7 +1039,10 @@ class HeadsUpManagerImplTest(flags: FlagsParameterization) : SysuiTestCase() { val flags: List<FlagsParameterization> get() = buildList { addAll( - FlagsParameterization.allCombinationsOf(NotificationThrottleHun.FLAG_NAME) + FlagsParameterization.allCombinationsOf( + NotificationThrottleHun.FLAG_NAME, + StatusBarNotifChips.FLAG_NAME, + ) .andSceneContainer() ) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt index 46c360aecd48..be20bc1bf9d4 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt @@ -225,16 +225,12 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati val displayId = 123 darkIconRepository.darkState(displayId).value = SysuiDarkIconDispatcher.DarkChange(emptyList(), 0f, 0xAABBCC) - val iconColorsLookup by collectLastValue(underTest.iconColors(displayId)) - assertThat(iconColorsLookup).isNotNull() - - val iconColors = iconColorsLookup?.iconColors(Rect()) + val iconColors by collectLastValue(underTest.iconColors(displayId)) assertThat(iconColors).isNotNull() - iconColors!! - assertThat(iconColors.tint).isEqualTo(0xAABBCC) + assertThat(iconColors!!.tint).isEqualTo(0xAABBCC) - val staticDrawableColor = iconColors.staticDrawableColor(Rect()) + val staticDrawableColor = iconColors!!.staticDrawableColor(Rect()) assertThat(staticDrawableColor).isEqualTo(0xAABBCC) } @@ -245,8 +241,7 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati val displayId = 321 darkIconRepository.darkState(displayId).value = SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC) - val iconColorsLookup by collectLastValue(underTest.iconColors(displayId)) - val iconColors = iconColorsLookup?.iconColors(Rect(1, 1, 4, 4)) + val iconColors by collectLastValue(underTest.iconColors(displayId)) val staticDrawableColor = iconColors?.staticDrawableColor(Rect(6, 6, 7, 7)) assertThat(staticDrawableColor).isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT) } @@ -257,9 +252,9 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati val displayId = 987 darkIconRepository.darkState(displayId).value = SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC) - val iconColorsLookup by collectLastValue(underTest.iconColors(displayId)) - val iconColors = iconColorsLookup?.iconColors(Rect(6, 6, 7, 7)) - assertThat(iconColors).isNull() + val iconColors by collectLastValue(underTest.iconColors(displayId)) + assertThat(iconColors!!.staticDrawableColor(Rect(6, 6, 7, 7))) + .isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT) } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java index af2789b8401a..f7673da6dfb0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java @@ -75,8 +75,8 @@ public class HeadsUpViewBinderTest extends SysuiTestCase { return new CancellationSignal(); }); - mViewBinder.bindHeadsUpView(mEntry, null); - verify(mLogger).startBindingHun(eq(mEntry)); + mViewBinder.bindHeadsUpView(mEntry, /* isPinnedByUser= */ false, null); + verify(mLogger).startBindingHun(mEntry, /* isPinnedByUser= */ false); verifyNoMoreInteractions(mLogger); clearInvocations(mLogger); @@ -85,8 +85,8 @@ public class HeadsUpViewBinderTest extends SysuiTestCase { verifyNoMoreInteractions(mLogger); clearInvocations(mLogger); - mViewBinder.bindHeadsUpView(mEntry, null); - verify(mLogger).startBindingHun(eq(mEntry)); + mViewBinder.bindHeadsUpView(mEntry, /* isPinnedByUser= */ true, null); + verify(mLogger).startBindingHun(mEntry, /* isPinnedByUser= */ true); verifyNoMoreInteractions(mLogger); clearInvocations(mLogger); @@ -116,8 +116,8 @@ public class HeadsUpViewBinderTest extends SysuiTestCase { return new CancellationSignal(); }); - mViewBinder.bindHeadsUpView(mEntry, null); - verify(mLogger).startBindingHun(eq(mEntry)); + mViewBinder.bindHeadsUpView(mEntry, /* isPinnedByUser= */ false, null); + verify(mLogger).startBindingHun(mEntry, /* isPinnedByUser= */ false); verifyNoMoreInteractions(mLogger); clearInvocations(mLogger); @@ -140,8 +140,8 @@ public class HeadsUpViewBinderTest extends SysuiTestCase { return new CancellationSignal(); }); - mViewBinder.bindHeadsUpView(mEntry, null); - verify(mLogger).startBindingHun(eq(mEntry)); + mViewBinder.bindHeadsUpView(mEntry, /* isPinnedByUser= */ true, null); + verify(mLogger).startBindingHun(mEntry, /* isPinnedByUser= */ true); verifyNoMoreInteractions(mLogger); clearInvocations(mLogger); @@ -167,8 +167,8 @@ public class HeadsUpViewBinderTest extends SysuiTestCase { return new CancellationSignal(); }); - mViewBinder.bindHeadsUpView(mEntry, null); - verify(mLogger).startBindingHun(eq(mEntry)); + mViewBinder.bindHeadsUpView(mEntry, /* isPinnedByUser= */ false, null); + verify(mLogger).startBindingHun(mEntry, /* isPinnedByUser= */ false); verifyNoMoreInteractions(mLogger); clearInvocations(mLogger); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt index 9f98fd4c8508..5a5ec90a5f44 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt @@ -21,9 +21,8 @@ import android.testing.TestableLooper.RunWithLooper import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.settingslib.Utils -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase +import com.android.systemui.res.R import com.android.systemui.statusbar.notification.FakeShadowView import com.android.systemui.statusbar.notification.NotificationUtils import com.android.systemui.statusbar.notification.SourceType @@ -62,8 +61,8 @@ class ActivatableNotificationViewTest : SysuiTestCase() { } as T? } - mNormalColor = Utils.getColorAttrDefaultColor(mContext, - com.android.internal.R.attr.materialColorSurfaceContainerHigh) + mNormalColor = + mContext.getColor(com.android.internal.R.color.materialColorSurfaceContainerHigh) } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt index a9afb0658c50..f4c254562420 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper import android.view.View @@ -23,12 +24,15 @@ import android.widget.TextView import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.kosmos.collectLastValue +import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.plugins.fakeDarkIconDispatcher import com.android.systemui.plugins.statusbar.statusBarStateController import com.android.systemui.shade.ShadeHeadsUpTracker import com.android.systemui.shade.shadeViewController import com.android.systemui.statusbar.HeadsUpStatusBarView +import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips import com.android.systemui.statusbar.commandQueue import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationIconInteractor @@ -114,65 +118,172 @@ class HeadsUpAppearanceControllerTest : SysuiTestCase() { } @Test - fun testShowinEntryUpdated() { + fun showingEntryUpdated_whenPinnedBySystem() { row.setPinnedStatus(PinnedStatus.PinnedBySystem) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(true) - whenever(headsUpManager.getTopEntry()).thenReturn(entry) + setHeadsUpNotifOnManager(entry) underTest.onHeadsUpPinned(entry) + assertThat(headsUpStatusBarView.showingEntry).isEqualTo(row.entry) row.setPinnedStatus(PinnedStatus.NotPinned) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(false) + setHeadsUpNotifOnManager(null) underTest.onHeadsUpUnPinned(entry) + + assertThat(headsUpStatusBarView.showingEntry).isNull() + } + + @Test + @DisableFlags(StatusBarNotifChips.FLAG_NAME) + fun showingEntryUpdated_whenPinnedByUser_andFlagOff() { + row.setPinnedStatus(PinnedStatus.PinnedByUser) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + assertThat(headsUpStatusBarView.showingEntry).isEqualTo(row.entry) + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun showingEntryNotUpdated_whenPinnedByUser_andFlagOn() { + // WHEN the HUN was pinned by the user + row.setPinnedStatus(PinnedStatus.PinnedByUser) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + // THEN we don't show the HUN status bar view assertThat(headsUpStatusBarView.showingEntry).isNull() } @Test - fun testPinnedStatusUpdated() { + fun pinnedStatusUpdatedToSystem_whenPinnedBySystem() { row.setPinnedStatus(PinnedStatus.PinnedBySystem) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(true) - whenever(headsUpManager.getTopEntry()).thenReturn(entry) + setHeadsUpNotifOnManager(entry) underTest.onHeadsUpPinned(entry) assertThat(underTest.pinnedStatus).isEqualTo(PinnedStatus.PinnedBySystem) row.setPinnedStatus(PinnedStatus.NotPinned) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(false) + setHeadsUpNotifOnManager(null) underTest.onHeadsUpUnPinned(entry) assertThat(underTest.pinnedStatus).isEqualTo(PinnedStatus.NotPinned) } @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun pinnedStatusUpdatedToNotPinned_whenPinnedByUser_andFlagOn() { + row.setPinnedStatus(PinnedStatus.PinnedByUser) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + // It's unintuitive that the pinnedStatus wouldn't match the status on the notification. + // Explanation: HeadsUpAppearanceController#updateTopEntry doesn't do anything if + // HeadsUpManager.pinnedHeadsUpStatus != PinnedBySystem. So when we're PinnedByUser, + // HeadsUpAppearanceController early-returns before even updating the pinned status. + assertThat(underTest.pinnedStatus).isEqualTo(PinnedStatus.NotPinned) + } + + @Test + fun isolatedIconSet_whenPinnedBySystem() = + kosmos.runTest { + val latestIsolatedIcon by + collectLastValue(kosmos.headsUpNotificationIconInteractor.isolatedNotification) + + row.setPinnedStatus(PinnedStatus.PinnedBySystem) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + assertThat(latestIsolatedIcon).isEqualTo(entry.key) + + row.setPinnedStatus(PinnedStatus.NotPinned) + setHeadsUpNotifOnManager(null) + underTest.onHeadsUpUnPinned(entry) + + assertThat(latestIsolatedIcon).isNull() + } + + @Test + @DisableFlags(StatusBarNotifChips.FLAG_NAME) + fun isolatedIconSet_whenPinnedByUser_andFlagOff() = + kosmos.runTest { + val latestIsolatedIcon by + collectLastValue(kosmos.headsUpNotificationIconInteractor.isolatedNotification) + + row.setPinnedStatus(PinnedStatus.PinnedByUser) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + assertThat(latestIsolatedIcon).isEqualTo(entry.key) + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun isolatedIconNotSet_whenPinnedByUser_andFlagOn() = + kosmos.runTest { + val latestIsolatedIcon by + collectLastValue(kosmos.headsUpNotificationIconInteractor.isolatedNotification) + + row.setPinnedStatus(PinnedStatus.PinnedByUser) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + assertThat(latestIsolatedIcon).isNull() + } + + @Test @DisableFlags(AsyncGroupHeaderViewInflation.FLAG_NAME) fun testHeaderUpdated() { row.setPinnedStatus(PinnedStatus.PinnedBySystem) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(true) - whenever(headsUpManager.getTopEntry()).thenReturn(entry) + setHeadsUpNotifOnManager(entry) underTest.onHeadsUpPinned(entry) assertThat(row.headerVisibleAmount).isEqualTo(0.0f) row.setPinnedStatus(PinnedStatus.NotPinned) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(false) + setHeadsUpNotifOnManager(null) underTest.onHeadsUpUnPinned(entry) assertThat(row.headerVisibleAmount).isEqualTo(1.0f) } @Test - fun testOperatorNameViewUpdated() { + fun operatorNameViewUpdated_whenPinnedBySystem() { underTest.setAnimationsEnabled(false) row.setPinnedStatus(PinnedStatus.PinnedBySystem) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(true) - whenever(headsUpManager.getTopEntry()).thenReturn(entry) + setHeadsUpNotifOnManager(entry) underTest.onHeadsUpPinned(entry) assertThat(operatorNameView.visibility).isEqualTo(View.INVISIBLE) row.setPinnedStatus(PinnedStatus.NotPinned) - whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(false) + setHeadsUpNotifOnManager(null) underTest.onHeadsUpUnPinned(entry) assertThat(operatorNameView.visibility).isEqualTo(View.VISIBLE) } @Test + @DisableFlags(StatusBarNotifChips.FLAG_NAME) + fun operatorNameViewUpdated_whenPinnedByUser_andFlagOff() { + underTest.setAnimationsEnabled(false) + + row.setPinnedStatus(PinnedStatus.PinnedByUser) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + assertThat(operatorNameView.visibility).isEqualTo(View.INVISIBLE) + } + + @Test + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun operatorNameViewNotUpdated_whenPinnedByUser_andFlagOn() { + underTest.setAnimationsEnabled(false) + + // WHEN the row was pinned by the user + row.setPinnedStatus(PinnedStatus.PinnedByUser) + setHeadsUpNotifOnManager(entry) + underTest.onHeadsUpPinned(entry) + + // THEN we don't need to hide the operator name view + assertThat(operatorNameView.visibility).isEqualTo(View.VISIBLE) + } + + @Test fun constructor_animationValuesUpdated() { val appearFraction = .75f val expandedHeight = 400f @@ -276,4 +387,16 @@ class HeadsUpAppearanceControllerTest : SysuiTestCase() { verify(phoneStatusBarTransitions).onHeadsUpStateChanged(false) } + + private fun setHeadsUpNotifOnManager(entry: NotificationEntry?) { + if (entry != null) { + whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(true) + whenever(headsUpManager.pinnedHeadsUpStatus()).thenReturn(entry.pinnedStatus) + whenever(headsUpManager.getTopEntry()).thenReturn(entry) + } else { + whenever(headsUpManager.hasPinnedHeadsUp()).thenReturn(false) + whenever(headsUpManager.pinnedHeadsUpStatus()).thenReturn(PinnedStatus.NotPinned) + whenever(headsUpManager.getTopEntry()).thenReturn(null) + } + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java deleted file mode 100644 index 41782a123f14..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java +++ /dev/null @@ -1,379 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package com.android.systemui.statusbar.phone; - -import static android.view.Display.DEFAULT_DISPLAY; - -import static com.android.systemui.statusbar.notification.interruption.VisualInterruptionType.BUBBLE; -import static com.android.systemui.statusbar.notification.interruption.VisualInterruptionType.PEEK; -import static com.android.systemui.statusbar.notification.interruption.VisualInterruptionType.PULSE; - -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.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.Notification; -import android.app.PendingIntent; -import android.app.StatusBarManager; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; -import android.testing.TestableLooper; -import android.testing.TestableLooper.RunWithLooper; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; - -import com.android.systemui.InitController; -import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.power.domain.interactor.PowerInteractor; -import com.android.systemui.settings.FakeDisplayTracker; -import com.android.systemui.shade.NotificationShadeWindowView; -import com.android.systemui.shade.QuickSettingsController; -import com.android.systemui.shade.ShadeController; -import com.android.systemui.shade.ShadeViewController; -import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.LockscreenShadeTransitionController; -import com.android.systemui.statusbar.NotificationLockscreenUserManager; -import com.android.systemui.statusbar.NotificationMediaManager; -import com.android.systemui.statusbar.NotificationRemoteInputManager; -import com.android.systemui.statusbar.NotificationShadeWindowController; -import com.android.systemui.statusbar.SysuiStatusBarStateController; -import com.android.systemui.statusbar.notification.DynamicPrivacyController; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; -import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource; -import com.android.systemui.statusbar.notification.domain.interactor.NotificationAlertsInteractor; -import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor; -import com.android.systemui.statusbar.notification.interruption.VisualInterruptionCondition; -import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider; -import com.android.systemui.statusbar.notification.interruption.VisualInterruptionFilter; -import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor; -import com.android.systemui.statusbar.notification.interruption.VisualInterruptionType; -import com.android.systemui.statusbar.notification.row.NotificationGutsManager; -import com.android.systemui.statusbar.notification.stack.NotificationListContainer; -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; -import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; -import com.android.systemui.statusbar.policy.KeyguardStateController; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; - -import java.util.List; -import java.util.Set; - -@SmallTest -@RunWith(AndroidJUnit4.class) -@RunWithLooper() -public class StatusBarNotificationPresenterTest extends SysuiTestCase { - private StatusBarNotificationPresenter mStatusBarNotificationPresenter; - private final VisualInterruptionDecisionProvider mVisualInterruptionDecisionProvider = - mock(VisualInterruptionDecisionProvider.class); - private NotificationInterruptSuppressor mInterruptSuppressor; - private VisualInterruptionCondition mAlertsDisabledCondition; - private VisualInterruptionCondition mVrModeCondition; - private VisualInterruptionFilter mNeedsRedactionFilter; - private VisualInterruptionCondition mPanelsDisabledCondition; - private CommandQueue mCommandQueue; - private final ShadeController mShadeController = mock(ShadeController.class); - private final NotificationAlertsInteractor mNotificationAlertsInteractor = - mock(NotificationAlertsInteractor.class); - private final KeyguardStateController mKeyguardStateController = - mock(KeyguardStateController.class); - - @Before - public void setup() { - mCommandQueue = new CommandQueue(mContext, new FakeDisplayTracker(mContext)); - mDependency.injectTestDependency(StatusBarStateController.class, - mock(SysuiStatusBarStateController.class)); - mDependency.injectTestDependency(ShadeController.class, mShadeController); - mDependency.injectMockDependency(NotificationRemoteInputManager.Callback.class); - mDependency.injectMockDependency(NotificationShadeWindowController.class); - - when(mNotificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(true); - - createPresenter(); - if (VisualInterruptionRefactor.isEnabled()) { - verifyAndCaptureSuppressors(); - } else { - verifyAndCaptureLegacySuppressor(); - } - } - - @Test - @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testInit_refactorDisabled() { - assertFalse(VisualInterruptionRefactor.isEnabled()); - assertNull(mAlertsDisabledCondition); - assertNull(mVrModeCondition); - assertNull(mNeedsRedactionFilter); - assertNull(mPanelsDisabledCondition); - assertNotNull(mInterruptSuppressor); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testInit_refactorEnabled() { - assertTrue(VisualInterruptionRefactor.isEnabled()); - assertNotNull(mAlertsDisabledCondition); - assertNotNull(mVrModeCondition); - assertNotNull(mNeedsRedactionFilter); - assertNotNull(mPanelsDisabledCondition); - assertNull(mInterruptSuppressor); - } - - @Test - @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testNoSuppressHeadsUp_default_refactorDisabled() { - assertFalse(mInterruptSuppressor.suppressAwakeHeadsUp(createNotificationEntry())); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testNoSuppressHeadsUp_default_refactorEnabled() { - assertFalse(mAlertsDisabledCondition.shouldSuppress()); - assertFalse(mVrModeCondition.shouldSuppress()); - assertFalse(mNeedsRedactionFilter.shouldSuppress(createNotificationEntry())); - assertFalse(mAlertsDisabledCondition.shouldSuppress()); - } - - @Test - @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressHeadsUp_disabledStatusBar_refactorDisabled() { - mCommandQueue.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_EXPAND, 0, - false /* animate */); - TestableLooper.get(this).processAllMessages(); - - assertTrue("The panel should suppress heads up while disabled", - mInterruptSuppressor.suppressAwakeHeadsUp(createNotificationEntry())); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressHeadsUp_disabledStatusBar_refactorEnabled() { - mCommandQueue.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_EXPAND, 0, - false /* animate */); - TestableLooper.get(this).processAllMessages(); - - assertTrue("The panel should suppress heads up while disabled", - mPanelsDisabledCondition.shouldSuppress()); - } - - @Test - @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressHeadsUp_disabledNotificationShade_refactorDisabled() { - mCommandQueue.disable(DEFAULT_DISPLAY, 0, StatusBarManager.DISABLE2_NOTIFICATION_SHADE, - false /* animate */); - TestableLooper.get(this).processAllMessages(); - - assertTrue("The panel should suppress interruptions while notification shade disabled", - mInterruptSuppressor.suppressAwakeHeadsUp(createNotificationEntry())); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressHeadsUp_disabledNotificationShade_refactorEnabled() { - mCommandQueue.disable(DEFAULT_DISPLAY, 0, StatusBarManager.DISABLE2_NOTIFICATION_SHADE, - false /* animate */); - TestableLooper.get(this).processAllMessages(); - - assertTrue("The panel should suppress interruptions while notification shade disabled", - mPanelsDisabledCondition.shouldSuppress()); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testPanelsDisabledConditionSuppressesPeek() { - final Set<VisualInterruptionType> types = mPanelsDisabledCondition.getTypes(); - assertTrue(types.contains(PEEK)); - assertFalse(types.contains(PULSE)); - assertFalse(types.contains(BUBBLE)); - } - - @Test - @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorDisabled() { - when(mKeyguardStateController.isShowing()).thenReturn(true); - when(mKeyguardStateController.isOccluded()).thenReturn(false); - - assertFalse(mInterruptSuppressor.suppressAwakeHeadsUp(createFsiNotificationEntry())); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorEnabled() { - when(mKeyguardStateController.isShowing()).thenReturn(true); - when(mKeyguardStateController.isOccluded()).thenReturn(false); - - assertFalse(mNeedsRedactionFilter.shouldSuppress(createFsiNotificationEntry())); - - final Set<VisualInterruptionType> types = mNeedsRedactionFilter.getTypes(); - assertTrue(types.contains(PEEK)); - assertFalse(types.contains(PULSE)); - assertFalse(types.contains(BUBBLE)); - } - - @Test - @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressInterruptions_vrMode_refactorDisabled() { - mStatusBarNotificationPresenter.mVrMode = true; - - assertTrue("Vr mode should suppress interruptions", - mInterruptSuppressor.suppressAwakeInterruptions(createNotificationEntry())); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressInterruptions_vrMode_refactorEnabled() { - mStatusBarNotificationPresenter.mVrMode = true; - - assertTrue("Vr mode should suppress interruptions", mVrModeCondition.shouldSuppress()); - - final Set<VisualInterruptionType> types = mVrModeCondition.getTypes(); - assertTrue(types.contains(PEEK)); - assertFalse(types.contains(PULSE)); - assertTrue(types.contains(BUBBLE)); - } - - @Test - @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressInterruptions_statusBarAlertsDisabled_refactorDisabled() { - when(mNotificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false); - - assertTrue("When alerts aren't enabled, interruptions are suppressed", - mInterruptSuppressor.suppressInterruptions(createNotificationEntry())); - } - - @Test - @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) - public void testSuppressInterruptions_statusBarAlertsDisabled_refactorEnabled() { - when(mNotificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false); - - assertTrue("When alerts aren't enabled, interruptions are suppressed", - mAlertsDisabledCondition.shouldSuppress()); - - final Set<VisualInterruptionType> types = mAlertsDisabledCondition.getTypes(); - assertTrue(types.contains(PEEK)); - assertTrue(types.contains(PULSE)); - assertTrue(types.contains(BUBBLE)); - } - - private void createPresenter() { - final ShadeViewController shadeViewController = mock(ShadeViewController.class); - - final NotificationShadeWindowView notificationShadeWindowView = - mock(NotificationShadeWindowView.class); - when(notificationShadeWindowView.getResources()).thenReturn(mContext.getResources()); - - NotificationStackScrollLayoutController stackScrollLayoutController = - mock(NotificationStackScrollLayoutController.class); - when(stackScrollLayoutController.getView()).thenReturn( - mock(NotificationStackScrollLayout.class)); - - final InitController initController = new InitController(); - - mStatusBarNotificationPresenter = new StatusBarNotificationPresenter( - mContext, - shadeViewController, - mock(PanelExpansionInteractor.class), - mock(QuickSettingsController.class), - mock(HeadsUpManager.class), - notificationShadeWindowView, - mock(ActivityStarter.class), - stackScrollLayoutController, - mock(DozeScrimController.class), - mock(NotificationShadeWindowController.class), - mock(DynamicPrivacyController.class), - mKeyguardStateController, - mNotificationAlertsInteractor, - mock(LockscreenShadeTransitionController.class), - mock(PowerInteractor.class), - mCommandQueue, - mock(NotificationLockscreenUserManager.class), - mock(SysuiStatusBarStateController.class), - mock(NotifShadeEventSource.class), - mock(NotificationMediaManager.class), - mock(NotificationGutsManager.class), - initController, - mVisualInterruptionDecisionProvider, - mock(NotificationRemoteInputManager.class), - mock(NotificationRemoteInputManager.Callback.class), - mock(NotificationListContainer.class)); - - initController.executePostInitTasks(); - } - - private void verifyAndCaptureSuppressors() { - mInterruptSuppressor = null; - - final ArgumentCaptor<VisualInterruptionCondition> conditionCaptor = - ArgumentCaptor.forClass(VisualInterruptionCondition.class); - verify(mVisualInterruptionDecisionProvider, times(3)).addCondition( - conditionCaptor.capture()); - final List<VisualInterruptionCondition> conditions = conditionCaptor.getAllValues(); - mAlertsDisabledCondition = conditions.get(0); - mVrModeCondition = conditions.get(1); - mPanelsDisabledCondition = conditions.get(2); - - final ArgumentCaptor<VisualInterruptionFilter> needsRedactionFilterCaptor = - ArgumentCaptor.forClass(VisualInterruptionFilter.class); - verify(mVisualInterruptionDecisionProvider).addFilter(needsRedactionFilterCaptor.capture()); - mNeedsRedactionFilter = needsRedactionFilterCaptor.getValue(); - } - - private void verifyAndCaptureLegacySuppressor() { - mAlertsDisabledCondition = null; - mVrModeCondition = null; - mNeedsRedactionFilter = null; - mPanelsDisabledCondition = null; - - final ArgumentCaptor<NotificationInterruptSuppressor> suppressorCaptor = - ArgumentCaptor.forClass(NotificationInterruptSuppressor.class); - verify(mVisualInterruptionDecisionProvider).addLegacySuppressor(suppressorCaptor.capture()); - mInterruptSuppressor = suppressorCaptor.getValue(); - } - - private NotificationEntry createNotificationEntry() { - return new NotificationEntryBuilder() - .setPkg("a") - .setOpPkg("a") - .setTag("a") - .setNotification(new Notification.Builder(getContext(), "a").build()) - .build(); - } - - private NotificationEntry createFsiNotificationEntry() { - final Notification notification = new Notification.Builder(getContext(), "a") - .setFullScreenIntent(mock(PendingIntent.class), true) - .build(); - - return new NotificationEntryBuilder() - .setPkg("a") - .setOpPkg("a") - .setTag("a") - .setNotification(notification) - .build(); - } -} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt new file mode 100644 index 000000000000..c347347eff83 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt @@ -0,0 +1,454 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.phone + +import android.app.Notification +import android.app.Notification.Builder +import android.app.StatusBarManager +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import android.view.Display.DEFAULT_DISPLAY +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.InitController +import com.android.systemui.SysuiTestCase +import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository +import com.android.systemui.authentication.shared.model.AuthenticationMethodModel +import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor +import com.android.systemui.flags.EnableSceneContainer +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.runTest +import com.android.systemui.plugins.activityStarter +import com.android.systemui.power.domain.interactor.powerInteractor +import com.android.systemui.settings.FakeDisplayTracker +import com.android.systemui.shade.NotificationShadeWindowView +import com.android.systemui.shade.ShadeViewController +import com.android.systemui.shade.domain.interactor.panelExpansionInteractor +import com.android.systemui.statusbar.CommandQueue +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.lockscreenShadeTransitionController +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder +import com.android.systemui.statusbar.notification.domain.interactor.notificationAlertsInteractor +import com.android.systemui.statusbar.notification.dynamicPrivacyController +import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor +import com.android.systemui.statusbar.notification.interruption.VisualInterruptionCondition +import com.android.systemui.statusbar.notification.interruption.VisualInterruptionFilter +import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor +import com.android.systemui.statusbar.notification.interruption.VisualInterruptionType +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow +import com.android.systemui.statusbar.notification.stack.notificationStackScrollLayoutController +import com.android.systemui.statusbar.notification.visualInterruptionDecisionProvider +import com.android.systemui.statusbar.notificationLockscreenUserManager +import com.android.systemui.statusbar.notificationRemoteInputManager +import com.android.systemui.statusbar.notificationShadeWindowController +import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.statusbar.policy.keyguardStateController +import com.android.systemui.statusbar.sysuiStatusBarStateController +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.assertWithMessage +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +@SmallTest +@RunWith(AndroidJUnit4::class) +@RunWithLooper +class StatusBarNotificationPresenterTest : SysuiTestCase() { + private lateinit var kosmos: Kosmos + + private var interruptSuppressor: NotificationInterruptSuppressor? = null + private var alertsDisabledCondition: VisualInterruptionCondition? = null + private var vrModeCondition: VisualInterruptionCondition? = null + private var needsRedactionFilter: VisualInterruptionFilter? = null + private var panelsDisabledCondition: VisualInterruptionCondition? = null + + private val commandQueue: CommandQueue = CommandQueue(mContext, FakeDisplayTracker(mContext)) + private val keyguardStateController: KeyguardStateController + get() = kosmos.keyguardStateController + + private val notificationAlertsInteractor + get() = kosmos.notificationAlertsInteractor + + private val visualInterruptionDecisionProvider + get() = kosmos.visualInterruptionDecisionProvider + + private lateinit var underTest: StatusBarNotificationPresenter + + @Before + fun setup() { + kosmos = + testKosmos().apply { + whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()) + .thenReturn(true) + whenever(notificationStackScrollLayoutController.expandHelperCallback) + .thenReturn(mock()) + lockscreenShadeTransitionController.setStackScroller( + notificationStackScrollLayoutController + ) + lockscreenShadeTransitionController.centralSurfaces = mock() + } + + underTest = createPresenter() + if (VisualInterruptionRefactor.isEnabled) { + verifyAndCaptureSuppressors() + } else { + verifyAndCaptureLegacySuppressor() + } + } + + @Test + @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testInit_refactorDisabled() { + assertThat(VisualInterruptionRefactor.isEnabled).isFalse() + assertThat(alertsDisabledCondition).isNull() + assertThat(vrModeCondition).isNull() + assertThat(needsRedactionFilter).isNull() + assertThat(panelsDisabledCondition).isNull() + assertThat(interruptSuppressor).isNotNull() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testInit_refactorEnabled() { + assertThat(VisualInterruptionRefactor.isEnabled).isTrue() + assertThat(alertsDisabledCondition).isNotNull() + assertThat(vrModeCondition).isNotNull() + assertThat(needsRedactionFilter).isNotNull() + assertThat(panelsDisabledCondition).isNotNull() + assertThat(interruptSuppressor).isNull() + } + + @Test + @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testNoSuppressHeadsUp_default_refactorDisabled() { + assertThat(interruptSuppressor!!.suppressAwakeHeadsUp(createNotificationEntry())).isFalse() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testNoSuppressHeadsUp_default_refactorEnabled() { + assertThat(alertsDisabledCondition!!.shouldSuppress()).isFalse() + assertThat(vrModeCondition!!.shouldSuppress()).isFalse() + assertThat(needsRedactionFilter!!.shouldSuppress(createNotificationEntry())).isFalse() + assertThat(alertsDisabledCondition!!.shouldSuppress()).isFalse() + } + + @Test + @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressHeadsUp_disabledStatusBar_refactorDisabled() { + commandQueue.disable( + DEFAULT_DISPLAY, + StatusBarManager.DISABLE_EXPAND, + 0, + false, /* animate */ + ) + TestableLooper.get(this).processAllMessages() + + assertWithMessage("The panel should suppress heads up while disabled") + .that(interruptSuppressor!!.suppressAwakeHeadsUp(createNotificationEntry())) + .isTrue() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressHeadsUp_disabledStatusBar_refactorEnabled() { + commandQueue.disable( + DEFAULT_DISPLAY, + StatusBarManager.DISABLE_EXPAND, + 0, + false, /* animate */ + ) + TestableLooper.get(this).processAllMessages() + + assertWithMessage("The panel should suppress heads up while disabled") + .that(panelsDisabledCondition!!.shouldSuppress()) + .isTrue() + } + + @Test + @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressHeadsUp_disabledNotificationShade_refactorDisabled() { + commandQueue.disable( + DEFAULT_DISPLAY, + 0, + StatusBarManager.DISABLE2_NOTIFICATION_SHADE, + false, /* animate */ + ) + TestableLooper.get(this).processAllMessages() + + assertWithMessage( + "The panel should suppress interruptions while notification shade disabled" + ) + .that(interruptSuppressor!!.suppressAwakeHeadsUp(createNotificationEntry())) + .isTrue() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressHeadsUp_disabledNotificationShade_refactorEnabled() { + commandQueue.disable( + DEFAULT_DISPLAY, + 0, + StatusBarManager.DISABLE2_NOTIFICATION_SHADE, + false, /* animate */ + ) + TestableLooper.get(this).processAllMessages() + + assertWithMessage( + "The panel should suppress interruptions while notification shade disabled" + ) + .that(panelsDisabledCondition!!.shouldSuppress()) + .isTrue() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testPanelsDisabledConditionSuppressesPeek() { + val types: Set<VisualInterruptionType> = panelsDisabledCondition!!.types + assertThat(types).contains(VisualInterruptionType.PEEK) + assertThat(types) + .containsNoneOf(VisualInterruptionType.BUBBLE, VisualInterruptionType.PULSE) + } + + @Test + @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorDisabled() { + whenever(keyguardStateController.isShowing()).thenReturn(true) + whenever(keyguardStateController.isOccluded()).thenReturn(false) + + assertThat(interruptSuppressor!!.suppressAwakeHeadsUp(createFsiNotificationEntry())) + .isFalse() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorEnabled() { + whenever(keyguardStateController.isShowing()).thenReturn(true) + whenever(keyguardStateController.isOccluded()).thenReturn(false) + + assertThat(needsRedactionFilter!!.shouldSuppress(createFsiNotificationEntry())).isFalse() + + val types: Set<VisualInterruptionType> = needsRedactionFilter!!.types + assertThat(types).contains(VisualInterruptionType.PEEK) + assertThat(types) + .containsNoneOf(VisualInterruptionType.BUBBLE, VisualInterruptionType.PULSE) + } + + @Test + @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressInterruptions_vrMode_refactorDisabled() { + underTest.mVrMode = true + + assertWithMessage("Vr mode should suppress interruptions") + .that(interruptSuppressor!!.suppressAwakeInterruptions(createNotificationEntry())) + .isTrue() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressInterruptions_vrMode_refactorEnabled() { + underTest.mVrMode = true + + assertWithMessage("Vr mode should suppress interruptions") + .that(vrModeCondition!!.shouldSuppress()) + .isTrue() + + val types: Set<VisualInterruptionType> = vrModeCondition!!.types + assertThat(types).contains(VisualInterruptionType.PEEK) + assertThat(types).doesNotContain(VisualInterruptionType.PULSE) + assertThat(types).contains(VisualInterruptionType.BUBBLE) + } + + @Test + @DisableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressInterruptions_statusBarAlertsDisabled_refactorDisabled() { + whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false) + + assertWithMessage("When alerts aren't enabled, interruptions are suppressed") + .that(interruptSuppressor!!.suppressInterruptions(createNotificationEntry())) + .isTrue() + } + + @Test + @EnableFlags(VisualInterruptionRefactor.FLAG_NAME) + fun testSuppressInterruptions_statusBarAlertsDisabled_refactorEnabled() { + whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false) + + assertWithMessage("When alerts aren't enabled, interruptions are suppressed") + .that(alertsDisabledCondition!!.shouldSuppress()) + .isTrue() + + val types: Set<VisualInterruptionType> = alertsDisabledCondition!!.types + assertThat(types).contains(VisualInterruptionType.PEEK) + assertThat(types).contains(VisualInterruptionType.PULSE) + assertThat(types).contains(VisualInterruptionType.BUBBLE) + } + + @Test + @EnableSceneContainer + fun testExpandSensitiveNotification_onLockScreen_opensShade() = + kosmos.runTest { + // Given we are on the keyguard + kosmos.sysuiStatusBarStateController.state = StatusBarState.KEYGUARD + // And the device is locked + kosmos.fakeAuthenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin + ) + + // When the user expands a sensitive Notification + val entry = + createRow().entry.apply { + setSensitive(/* sensitive= */ true, /* deviceSensitive= */ true) + } + underTest.onExpandClicked(entry, mock(), /* nowExpanded= */ true) + + // Then we open the locked shade + assertThat(kosmos.sysuiStatusBarStateController.state) + .isEqualTo(StatusBarState.SHADE_LOCKED) + } + + @Test + @EnableSceneContainer + fun testExpandSensitiveNotification_onLockedShade_showsBouncer() = + kosmos.runTest { + // Given we are on the locked shade + kosmos.sysuiStatusBarStateController.state = StatusBarState.SHADE_LOCKED + // And the device is locked + kosmos.fakeAuthenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin + ) + + // When the user expands a sensitive Notification + val entry = + createRow().entry.apply { + setSensitive(/* sensitive= */ true, /* deviceSensitive= */ true) + } + underTest.onExpandClicked(entry, mock(), /* nowExpanded= */ true) + + // Then we show the bouncer + verify(kosmos.activityStarter).dismissKeyguardThenExecute(any(), eq(null), eq(false)) + // AND we are still on the locked shade + assertThat(kosmos.sysuiStatusBarStateController.state) + .isEqualTo(StatusBarState.SHADE_LOCKED) + } + + private fun createPresenter(): StatusBarNotificationPresenter { + val shadeViewController: ShadeViewController = mock() + + val notificationShadeWindowView: NotificationShadeWindowView = mock() + whenever(notificationShadeWindowView.resources).thenReturn(mContext.resources) + whenever(kosmos.notificationStackScrollLayoutController.view).thenReturn(mock()) + + val initController: InitController = InitController() + + return StatusBarNotificationPresenter( + mContext, + shadeViewController, + kosmos.panelExpansionInteractor, + /* quickSettingsController = */ mock(), + kosmos.headsUpManager, + notificationShadeWindowView, + kosmos.activityStarter, + kosmos.notificationStackScrollLayoutController, + kosmos.dozeScrimController, + kosmos.notificationShadeWindowController, + kosmos.dynamicPrivacyController, + kosmos.keyguardStateController, + kosmos.notificationAlertsInteractor, + kosmos.lockscreenShadeTransitionController, + kosmos.powerInteractor, + commandQueue, + kosmos.notificationLockscreenUserManager, + kosmos.sysuiStatusBarStateController, + /* notifShadeEventSource = */ mock(), + /* notificationMediaManager = */ mock(), + /* notificationGutsManager = */ mock(), + initController, + kosmos.visualInterruptionDecisionProvider, + kosmos.notificationRemoteInputManager, + /* remoteInputManagerCallback = */ mock(), + /* notificationListContainer = */ mock(), + kosmos.deviceUnlockedInteractor, + ) + .also { initController.executePostInitTasks() } + } + + private fun verifyAndCaptureSuppressors() { + interruptSuppressor = null + + val conditionCaptor = argumentCaptor<VisualInterruptionCondition>() + verify(visualInterruptionDecisionProvider, times(3)).addCondition(conditionCaptor.capture()) + val conditions: List<VisualInterruptionCondition> = conditionCaptor.allValues + alertsDisabledCondition = conditions[0] + vrModeCondition = conditions[1] + panelsDisabledCondition = conditions[2] + + val needsRedactionFilterCaptor = argumentCaptor<VisualInterruptionFilter>() + verify(visualInterruptionDecisionProvider).addFilter(needsRedactionFilterCaptor.capture()) + needsRedactionFilter = needsRedactionFilterCaptor.lastValue + } + + private fun verifyAndCaptureLegacySuppressor() { + alertsDisabledCondition = null + vrModeCondition = null + needsRedactionFilter = null + panelsDisabledCondition = null + + val suppressorCaptor = argumentCaptor<NotificationInterruptSuppressor>() + verify(visualInterruptionDecisionProvider).addLegacySuppressor(suppressorCaptor.capture()) + interruptSuppressor = suppressorCaptor.lastValue + } + + private fun createRow(): ExpandableNotificationRow { + val row: ExpandableNotificationRow = mock() + val entry: NotificationEntry = createNotificationEntry() + whenever(row.entry).thenReturn(entry) + entry.row = row + return row + } + + private fun createNotificationEntry(): NotificationEntry = + NotificationEntryBuilder() + .setPkg("a") + .setOpPkg("a") + .setTag("a") + .setNotification(Builder(mContext, "a").build()) + .build() + + private fun createFsiNotificationEntry(): NotificationEntry { + val notification: Notification = + Builder(mContext, "a").setFullScreenIntent(mock(), true).build() + + return NotificationEntryBuilder() + .setPkg("a") + .setOpPkg("a") + .setTag("a") + .setNotification(notification) + .build() + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt index ca1413e48966..b19645fadbdf 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt @@ -30,11 +30,13 @@ import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.statusbar.StatusBarIconView +import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository import com.android.systemui.statusbar.notification.data.model.activeNotificationModel import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository import com.android.systemui.statusbar.notification.shared.CallType import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel +import com.android.systemui.statusbar.window.fakeStatusBarWindowControllerStore import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest @@ -72,7 +74,7 @@ class OngoingCallInteractorTest : SysuiTestCase() { whenTime = 1000L, callType = CallType.Ongoing, statusBarChipIcon = testIconView, - contentIntent = testIntent + contentIntent = testIntent, ) ) } @@ -95,7 +97,9 @@ class OngoingCallInteractorTest : SysuiTestCase() { .apply { addIndividualNotif( activeNotificationModel( - key = "notif1", whenTime = 1000L, callType = CallType.Ongoing + key = "notif1", + whenTime = 1000L, + callType = CallType.Ongoing, ) ) } @@ -114,7 +118,9 @@ class OngoingCallInteractorTest : SysuiTestCase() { .apply { addIndividualNotif( activeNotificationModel( - key = "notif1", whenTime = 1000L, callType = CallType.Ongoing + key = "notif1", + whenTime = 1000L, + callType = CallType.Ongoing, ) ) } @@ -138,7 +144,7 @@ class OngoingCallInteractorTest : SysuiTestCase() { key = "notif1", whenTime = 1000L, callType = CallType.Ongoing, - uid = UID + uid = UID, ) ) } @@ -161,7 +167,7 @@ class OngoingCallInteractorTest : SysuiTestCase() { key = "notif1", whenTime = 1000L, callType = CallType.Ongoing, - uid = UID + uid = UID, ) ) } @@ -185,13 +191,12 @@ class OngoingCallInteractorTest : SysuiTestCase() { key = "notif1", whenTime = 1000L, callType = CallType.Ongoing, - uid = UID + uid = UID, ) ) } .build() - assertThat(latest) - .isInstanceOf(OngoingCallModel.InCall::class.java) + assertThat(latest).isInstanceOf(OngoingCallModel.InCall::class.java) // App becomes visible kosmos.activityManagerRepository.fake.setIsAppVisible(UID, true) @@ -202,6 +207,120 @@ class OngoingCallInteractorTest : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingCallModel.InCall::class.java) } + @Test + fun ongoingCallNotification_setsRequiresStatusBarVisibleTrue() = + kosmos.runTest { + val ongoingCallState by collectLastValue(underTest.ongoingCallState) + + val requiresStatusBarVisibleInRepository by + collectLastValue( + kosmos.fakeStatusBarModeRepository.defaultDisplay + .ongoingProcessRequiresStatusBarVisible + ) + val requiresStatusBarVisibleInWindowController by + collectLastValue( + kosmos.fakeStatusBarWindowControllerStore.defaultDisplay + .ongoingProcessRequiresStatusBarVisible + ) + repository.activeNotifications.value = + ActiveNotificationsStore.Builder() + .apply { + addIndividualNotif( + activeNotificationModel( + key = "notif1", + whenTime = 1000L, + callType = CallType.Ongoing, + uid = UID, + ) + ) + } + .build() + + assertThat(ongoingCallState).isInstanceOf(OngoingCallModel.InCall::class.java) + assertThat(requiresStatusBarVisibleInRepository).isTrue() + assertThat(requiresStatusBarVisibleInWindowController).isTrue() + } + + @Test + fun notificationRemoved_setsRequiresStatusBarVisibleFalse() = + kosmos.runTest { + val ongoingCallState by collectLastValue(underTest.ongoingCallState) + + val requiresStatusBarVisibleInRepository by + collectLastValue( + kosmos.fakeStatusBarModeRepository.defaultDisplay + .ongoingProcessRequiresStatusBarVisible + ) + val requiresStatusBarVisibleInWindowController by + collectLastValue( + kosmos.fakeStatusBarWindowControllerStore.defaultDisplay + .ongoingProcessRequiresStatusBarVisible + ) + + repository.activeNotifications.value = + ActiveNotificationsStore.Builder() + .apply { + addIndividualNotif( + activeNotificationModel( + key = "notif1", + whenTime = 1000L, + callType = CallType.Ongoing, + uid = UID, + ) + ) + } + .build() + + repository.activeNotifications.value = ActiveNotificationsStore() + + assertThat(ongoingCallState).isInstanceOf(OngoingCallModel.NoCall::class.java) + assertThat(requiresStatusBarVisibleInRepository).isFalse() + assertThat(requiresStatusBarVisibleInWindowController).isFalse() + } + + @Test + fun ongoingCallNotification_appBecomesVisible_setsRequiresStatusBarVisibleFalse() = + kosmos.runTest { + val ongoingCallState by collectLastValue(underTest.ongoingCallState) + + val requiresStatusBarVisibleInRepository by + collectLastValue( + kosmos.fakeStatusBarModeRepository.defaultDisplay + .ongoingProcessRequiresStatusBarVisible + ) + val requiresStatusBarVisibleInWindowController by + collectLastValue( + kosmos.fakeStatusBarWindowControllerStore.defaultDisplay + .ongoingProcessRequiresStatusBarVisible + ) + + kosmos.activityManagerRepository.fake.startingIsAppVisibleValue = false + repository.activeNotifications.value = + ActiveNotificationsStore.Builder() + .apply { + addIndividualNotif( + activeNotificationModel( + key = "notif1", + whenTime = 1000L, + callType = CallType.Ongoing, + uid = UID, + ) + ) + } + .build() + + assertThat(ongoingCallState).isInstanceOf(OngoingCallModel.InCall::class.java) + assertThat(requiresStatusBarVisibleInRepository).isTrue() + assertThat(requiresStatusBarVisibleInWindowController).isTrue() + + kosmos.activityManagerRepository.fake.setIsAppVisible(UID, true) + + assertThat(ongoingCallState) + .isInstanceOf(OngoingCallModel.InCallWithVisibleApp::class.java) + assertThat(requiresStatusBarVisibleInRepository).isFalse() + assertThat(requiresStatusBarVisibleInWindowController).isFalse() + } + companion object { private const val UID = 885 } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt index 038722cd9608..bf1fbad074cd 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt @@ -20,8 +20,6 @@ import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.settingslib.AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH -import com.android.settingslib.AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH_NONE import com.android.settingslib.mobile.MobileMappings import com.android.settingslib.mobile.TelephonyIcons.G import com.android.settingslib.mobile.TelephonyIcons.THREE_G @@ -40,12 +38,15 @@ import com.android.systemui.statusbar.connectivity.MobileIconCarrierIdOverridesF import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState +import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionRepository +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionRepository.Companion.DEFAULT_NETWORK_NAME import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconInteractorImpl import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorImpl import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel +import com.android.systemui.statusbar.pipeline.mobile.ui.model.MobileContentDescription import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot @@ -255,59 +256,146 @@ class MobileIconViewModelTest : SysuiTestCase() { @Test fun contentDescription_notInService_usesNoPhone() = testScope.runTest { - var latest: ContentDescription? = null - val job = underTest.contentDescription.onEach { latest = it }.launchIn(this) + val latest by collectLastValue(underTest.contentDescription) repository.isInService.value = false - assertThat((latest as ContentDescription.Resource).res) - .isEqualTo(PHONE_SIGNAL_STRENGTH_NONE) + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL)) + } - job.cancel() + @Test + fun contentDescription_includesNetworkName() = + testScope.runTest { + val latest by collectLastValue(underTest.contentDescription) + + repository.isInService.value = true + repository.networkName.value = NetworkNameModel.SubscriptionDerived("Test Network Name") + repository.numberOfLevels.value = 5 + repository.setAllLevels(3) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular("Test Network Name", THREE_BARS)) } @Test fun contentDescription_inService_usesLevel() = testScope.runTest { - var latest: ContentDescription? = null - val job = underTest.contentDescription.onEach { latest = it }.launchIn(this) + val latest by collectLastValue(underTest.contentDescription) repository.setAllLevels(2) - assertThat((latest as ContentDescription.Resource).res) - .isEqualTo(PHONE_SIGNAL_STRENGTH[2]) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, TWO_BARS)) repository.setAllLevels(0) - assertThat((latest as ContentDescription.Resource).res) - .isEqualTo(PHONE_SIGNAL_STRENGTH[0]) - job.cancel() + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL)) } @Test - fun contentDescription_nonInflated_invalidLevelIsNull() = + fun contentDescription_nonInflated_invalidLevelUsesNoSignalText() = testScope.runTest { val latest by collectLastValue(underTest.contentDescription) repository.inflateSignalStrength.value = false repository.setAllLevels(-1) - assertThat(latest).isNull() + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL)) repository.setAllLevels(100) - assertThat(latest).isNull() + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL)) + } + + @Test + fun contentDescription_nonInflated_levelStrings() = + testScope.runTest { + val latest by collectLastValue(underTest.contentDescription) + + repository.inflateSignalStrength.value = false + repository.setAllLevels(0) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL)) + + repository.setAllLevels(1) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, ONE_BAR)) + + repository.setAllLevels(2) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, TWO_BARS)) + + repository.setAllLevels(3) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, THREE_BARS)) + + repository.setAllLevels(4) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, FULL_BARS)) } @Test - fun contentDescription_inflated_invalidLevelIsNull() = + fun contentDescription_inflated_invalidLevelUsesNoSignalText() = testScope.runTest { val latest by collectLastValue(underTest.contentDescription) repository.inflateSignalStrength.value = true repository.numberOfLevels.value = 6 + repository.setAllLevels(-2) - assertThat(latest).isNull() + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL)) repository.setAllLevels(100) - assertThat(latest).isNull() + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL)) + } + + @Test + fun contentDescription_inflated_levelStrings() = + testScope.runTest { + val latest by collectLastValue(underTest.contentDescription) + + repository.inflateSignalStrength.value = true + repository.numberOfLevels.value = 6 + + // Note that the _repo_ level is 1 lower than the reported level through the interactor + + repository.setAllLevels(0) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, ONE_BAR)) + + repository.setAllLevels(1) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, TWO_BARS)) + + repository.setAllLevels(2) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, THREE_BARS)) + + repository.setAllLevels(3) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, FOUR_BARS)) + + repository.setAllLevels(4) + + assertThat(latest as MobileContentDescription.Cellular) + .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, FULL_BARS)) } @Test @@ -323,7 +411,10 @@ class MobileIconViewModelTest : SysuiTestCase() { repository.setAllLevels(i) when (i) { -1, - 5 -> assertWithMessage("Level $i is expected to be null").that(latest).isNull() + 5 -> + assertWithMessage("Level $i is expected to be 'no signal'") + .that((latest as MobileContentDescription.Cellular).levelDescriptionRes) + .isEqualTo(NO_SIGNAL) else -> assertWithMessage("Level $i is expected not to be null") .that(latest) @@ -344,7 +435,10 @@ class MobileIconViewModelTest : SysuiTestCase() { repository.setAllLevels(i) when (i) { -2, - 5 -> assertWithMessage("Level $i is expected to be null").that(latest).isNull() + 5 -> + assertWithMessage("Level $i is expected to be 'no signal'") + .that((latest as MobileContentDescription.Cellular).levelDescriptionRes) + .isEqualTo(NO_SIGNAL) else -> assertWithMessage("Level $i is not expected to be null") .that(latest) @@ -967,5 +1061,13 @@ class MobileIconViewModelTest : SysuiTestCase() { companion object { private const val SUB_1_ID = 1 + + // For convenience, just define these as constants + private val NO_SIGNAL = R.string.accessibility_no_signal + private val ONE_BAR = R.string.accessibility_one_bar + private val TWO_BARS = R.string.accessibility_two_bars + private val THREE_BARS = R.string.accessibility_three_bars + private val FOUR_BARS = R.string.accessibility_four_bars + private val FULL_BARS = R.string.accessibility_signal_full } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt index 7b04fc827d83..5c1141b94bc8 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt @@ -67,8 +67,9 @@ import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationSt import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle import com.android.systemui.statusbar.notification.data.model.activeNotificationModel import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore -import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository +import com.android.systemui.statusbar.notification.data.repository.UnconfinedFakeHeadsUpRowRepository import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository +import com.android.systemui.statusbar.notification.headsup.PinnedStatus import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository @@ -76,6 +77,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBar import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.junit.Before @@ -518,7 +520,27 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isClockVisible_allowedByFlags_hunActive_notVisible() = + @EnableFlags(StatusBarNotifChips.FLAG_NAME) + fun isClockVisible_allowedByFlags_hunPinnedByUser_visible() = + kosmos.runTest { + val latest by collectLastValue(underTest.isClockVisible) + transitionKeyguardToGone() + + fakeDisableFlagsRepository.disableFlags.value = + DisableFlagsModel(DISABLE_NONE, DISABLE2_NONE) + // there is an active HUN + headsUpNotificationRepository.setNotifications( + UnconfinedFakeHeadsUpRowRepository( + key = "key", + pinnedStatus = MutableStateFlow(PinnedStatus.PinnedByUser), + ) + ) + + assertThat(latest!!.visibility).isEqualTo(View.VISIBLE) + } + + @Test + fun isClockVisible_allowedByFlags_hunPinnedBySystem_notVisible() = kosmos.runTest { val latest by collectLastValue(underTest.isClockVisible) transitionKeyguardToGone() @@ -527,7 +549,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { DisableFlagsModel(DISABLE_NONE, DISABLE2_NONE) // there is an active HUN headsUpNotificationRepository.setNotifications( - fakeHeadsUpRowRepository(isPinned = true) + UnconfinedFakeHeadsUpRowRepository( + key = "key", + pinnedStatus = MutableStateFlow(PinnedStatus.PinnedBySystem), + ) ) assertThat(latest!!.visibility).isEqualTo(View.INVISIBLE) @@ -541,10 +566,14 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { fakeDisableFlagsRepository.disableFlags.value = DisableFlagsModel(DISABLE_NONE, DISABLE2_NONE) - // there is an active HUN + // there is an active HUN pinned by the system headsUpNotificationRepository.setNotifications( - fakeHeadsUpRowRepository(isPinned = true) + UnconfinedFakeHeadsUpRowRepository( + key = "key", + pinnedStatus = MutableStateFlow(PinnedStatus.PinnedBySystem), + ) ) + assertThat(latest!!.visibility).isEqualTo(View.INVISIBLE) // hun goes away headsUpNotificationRepository.setNotifications(listOf()) @@ -562,7 +591,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { DisableFlagsModel(DISABLE_CLOCK, DISABLE2_NONE) // there is an active HUN headsUpNotificationRepository.setNotifications( - fakeHeadsUpRowRepository(isPinned = true) + UnconfinedFakeHeadsUpRowRepository( + key = "key", + pinnedStatus = MutableStateFlow(PinnedStatus.PinnedBySystem), + ) ) assertThat(latest!!.visibility).isEqualTo(View.INVISIBLE) @@ -898,10 +930,6 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE) } - // Cribbed from [HeadsUpNotificationInteractorTest.kt] - private fun fakeHeadsUpRowRepository(key: String = "test key", isPinned: Boolean = false) = - FakeHeadsUpRowRepository(key = key, isPinned = isPinned) - private fun activeNotificationsStore(notifications: List<ActiveNotificationModel>) = ActiveNotificationsStore.Builder() .apply { notifications.forEach(::addIndividualNotif) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/CastDeviceTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/CastDeviceTest.kt index 1b7b47f49af2..2eac39e25759 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/CastDeviceTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/CastDeviceTest.kt @@ -66,7 +66,7 @@ class CastDeviceTest : SysuiTestCase() { doAnswer { // See Utils.isHeadlessRemoteDisplayProvider if ((it.arguments[0] as Intent).`package` == HEADLESS_REMOTE_PACKAGE) { - emptyList() + emptyList<ResolveInfo>() } else { listOf(mock<ResolveInfo>()) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt index d9d81692e2b6..2f3f75fdb6ff 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt @@ -22,7 +22,6 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.LEFT import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.RIGHT -import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE @@ -45,24 +44,6 @@ class BackGestureRecognizerTest : SysuiTestCase() { } @Test - fun triggersGestureFinishedForThreeFingerGestureRight() { - assertStateAfterEvents(events = ThreeFingerGesture.swipeRight(), expectedState = Finished) - } - - @Test - fun triggersGestureFinishedForThreeFingerGestureLeft() { - assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = Finished) - } - - @Test - fun triggersGestureProgressForThreeFingerGestureStarted() { - assertStateAfterEvents( - events = ThreeFingerGesture.startEvents(x = 0f, y = 0f), - expectedState = InProgress(), - ) - } - - @Test fun triggersProgressRelativeToDistanceWhenSwipingLeft() { assertProgressWhileMovingFingers( deltaX = -SWIPE_DISTANCE / 2, @@ -86,13 +67,6 @@ class BackGestureRecognizerTest : SysuiTestCase() { ) } - private fun assertProgressWhileMovingFingers(deltaX: Float, expected: InProgress) { - assertStateAfterEvents( - events = ThreeFingerGesture.eventsForGestureInProgress { move(deltaX = deltaX) }, - expectedState = expected, - ) - } - @Test fun triggeredProgressIsNoBiggerThanOne() { assertProgressWhileMovingFingers( @@ -105,30 +79,13 @@ class BackGestureRecognizerTest : SysuiTestCase() { ) } - @Test - fun doesntTriggerGestureFinished_onGestureDistanceTooShort() { + private fun assertProgressWhileMovingFingers(deltaX: Float, expected: InProgress) { assertStateAfterEvents( - events = ThreeFingerGesture.swipeLeft(distancePx = SWIPE_DISTANCE / 2), - expectedState = NotStarted, + events = ThreeFingerGesture.eventsForGestureInProgress { move(deltaX = deltaX) }, + expectedState = expected, ) } - @Test - fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() { - assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NotStarted) - assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NotStarted) - } - - @Test - fun doesntTriggerGestureFinished_onTwoFingersSwipe() { - assertStateAfterEvents(events = TwoFingerGesture.swipeRight(), expectedState = NotStarted) - } - - @Test - fun doesntTriggerGestureFinished_onFourFingersSwipe() { - assertStateAfterEvents(events = FourFingerGesture.swipeRight(), expectedState = NotStarted) - } - private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) { events.forEach { gestureRecognizer.accept(it) } assertThat(gestureState).isEqualTo(expectedState) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizerTest.kt index 7aa389a1739f..8d0d172ada12 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizerTest.kt @@ -21,7 +21,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.testKosmos -import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE @@ -57,37 +56,17 @@ class HomeGestureRecognizerTest : SysuiTestCase() { } @Test - fun triggersGestureFinishedForThreeFingerGestureUp() { - assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = Finished) - } - - @Test fun doesntTriggerGestureFinished_onGestureSpeedTooSlow() { velocityTracker.setVelocity(Velocity(SLOW)) assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NotStarted) } @Test - fun triggersGestureProgressForThreeFingerGestureStarted() { - assertStateAfterEvents( - events = ThreeFingerGesture.startEvents(x = 0f, y = 0f), - expectedState = InProgress(), - ) - } - - @Test fun triggersProgressRelativeToDistance() { assertProgressWhileMovingFingers(deltaY = -SWIPE_DISTANCE / 2, expectedProgress = 0.5f) assertProgressWhileMovingFingers(deltaY = -SWIPE_DISTANCE, expectedProgress = 1f) } - private fun assertProgressWhileMovingFingers(deltaY: Float, expectedProgress: Float) { - assertStateAfterEvents( - events = ThreeFingerGesture.eventsForGestureInProgress { move(deltaY = deltaY) }, - expectedState = InProgress(progress = expectedProgress), - ) - } - @Test fun triggeredProgressIsBetweenZeroAndOne() { // going in the wrong direction @@ -96,31 +75,13 @@ class HomeGestureRecognizerTest : SysuiTestCase() { assertProgressWhileMovingFingers(deltaY = -SWIPE_DISTANCE * 2, expectedProgress = 1f) } - @Test - fun doesntTriggerGestureFinished_onGestureDistanceTooShort() { + private fun assertProgressWhileMovingFingers(deltaY: Float, expectedProgress: Float) { assertStateAfterEvents( - events = ThreeFingerGesture.swipeUp(distancePx = SWIPE_DISTANCE / 2), - expectedState = NotStarted, + events = ThreeFingerGesture.eventsForGestureInProgress { move(deltaY = deltaY) }, + expectedState = InProgress(progress = expectedProgress), ) } - @Test - fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() { - assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NotStarted) - assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = NotStarted) - assertStateAfterEvents(events = ThreeFingerGesture.swipeRight(), expectedState = NotStarted) - } - - @Test - fun doesntTriggerGestureFinished_onTwoFingersSwipe() { - assertStateAfterEvents(events = TwoFingerGesture.swipeUp(), expectedState = NotStarted) - } - - @Test - fun doesntTriggerGestureFinished_onFourFingersSwipe() { - assertStateAfterEvents(events = FourFingerGesture.swipeUp(), expectedState = NotStarted) - } - private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) { events.forEach { gestureRecognizer.accept(it) } assertThat(gestureState).isEqualTo(expectedState) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizerTest.kt index cb74e6569b3f..7a77b63a8925 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizerTest.kt @@ -21,7 +21,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.testKosmos -import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE @@ -58,25 +57,12 @@ class RecentAppsGestureRecognizerTest : SysuiTestCase() { } @Test - fun triggersGestureFinishedForThreeFingerGestureUp() { - assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = Finished) - } - - @Test fun doesntTriggerGestureFinished_onGestureSpeedTooHigh() { velocityTracker.setVelocity(Velocity(FAST)) assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NotStarted) } @Test - fun triggersGestureProgressForThreeFingerGestureStarted() { - assertStateAfterEvents( - events = ThreeFingerGesture.startEvents(x = 0f, y = 0f), - expectedState = InProgress(progress = 0f), - ) - } - - @Test fun triggersProgressRelativeToDistance() { assertProgressWhileMovingFingers(deltaY = -SWIPE_DISTANCE / 2, expectedProgress = 0.5f) assertProgressWhileMovingFingers(deltaY = -SWIPE_DISTANCE, expectedProgress = 1f) @@ -97,31 +83,6 @@ class RecentAppsGestureRecognizerTest : SysuiTestCase() { assertProgressWhileMovingFingers(deltaY = -SWIPE_DISTANCE * 2, expectedProgress = 1f) } - @Test - fun doesntTriggerGestureFinished_onGestureDistanceTooShort() { - assertStateAfterEvents( - events = ThreeFingerGesture.swipeUp(distancePx = SWIPE_DISTANCE / 2), - expectedState = NotStarted, - ) - } - - @Test - fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() { - assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NotStarted) - assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = NotStarted) - assertStateAfterEvents(events = ThreeFingerGesture.swipeRight(), expectedState = NotStarted) - } - - @Test - fun doesntTriggerGestureFinished_onTwoFingersSwipe() { - assertStateAfterEvents(events = TwoFingerGesture.swipeUp(), expectedState = NotStarted) - } - - @Test - fun doesntTriggerGestureFinished_onFourFingersSwipe() { - assertStateAfterEvents(events = FourFingerGesture.swipeUp(), expectedState = NotStarted) - } - private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) { events.forEach { gestureRecognizer.accept(it) } assertThat(gestureState).isEqualTo(expectedState) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureRecognizerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureRecognizerTest.kt new file mode 100644 index 000000000000..de410894d0c0 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureRecognizerTest.kt @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.touchpad.tutorial.ui.gesture + +import android.view.MotionEvent +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted +import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE +import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizerTest.Companion.FAST +import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizerTest.Companion.SLOW +import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizerTest.Companion.THRESHOLD_VELOCITY_PX_PER_MS +import com.android.systemui.touchpad.ui.gesture.FakeVelocityTracker +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import platform.test.runner.parameterized.ParameterizedAndroidJunit4 +import platform.test.runner.parameterized.Parameters + +@SmallTest +@RunWith(ParameterizedAndroidJunit4::class) +class ThreeFingerGestureRecognizerTest( + private val recognizer: GestureRecognizer, + private val validGestures: Set<List<MotionEvent>>, + private val tooShortGesture: List<MotionEvent>, + @Suppress("UNUSED_PARAMETER") testSuffix: String, // here just for nicer test names +) : SysuiTestCase() { + + private var gestureState: GestureState = GestureState.NotStarted + + @Before + fun before() { + recognizer.addGestureStateCallback { gestureState = it } + } + + @Test + fun triggersGestureFinishedForValidGestures() { + validGestures.forEach { assertStateAfterEvents(events = it, expectedState = Finished) } + } + + @Test + fun triggersGestureProgressForThreeFingerGestureStarted() { + assertStateAfterEvents( + events = ThreeFingerGesture.startEvents(x = 0f, y = 0f), + expectedState = InProgress(progress = 0f), + ) + } + + @Test + fun doesntTriggerGestureFinished_onGestureDistanceTooShort() { + assertStateAfterEvents(events = tooShortGesture, expectedState = NotStarted) + } + + @Test + fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() { + val allThreeFingerGestures = + listOf( + ThreeFingerGesture.swipeUp(), + ThreeFingerGesture.swipeDown(), + ThreeFingerGesture.swipeLeft(), + ThreeFingerGesture.swipeRight(), + ) + val invalidGestures = allThreeFingerGestures.filter { it.differentFromAnyOf(validGestures) } + invalidGestures.forEach { assertStateAfterEvents(events = it, expectedState = NotStarted) } + } + + @Test + fun doesntTriggerGestureFinished_onTwoFingersSwipe() { + assertStateAfterEvents(events = TwoFingerGesture.swipeRight(), expectedState = NotStarted) + } + + @Test + fun doesntTriggerGestureFinished_onFourFingersSwipe() { + assertStateAfterEvents(events = FourFingerGesture.swipeRight(), expectedState = NotStarted) + } + + private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) { + events.forEach { recognizer.accept(it) } + assertThat(gestureState).isEqualTo(expectedState) + } + + companion object { + @JvmStatic + @Parameters(name = "{3}") + fun gesturesToTest(): List<Array<Any>> = + with(ThreeFingerGesture) { + listOf( + GestureTestData( + recognizer = BackGestureRecognizer(SWIPE_DISTANCE.toInt()), + validGestures = setOf(swipeRight(), swipeLeft()), + tooShortGesture = swipeRight(SWIPE_DISTANCE / 2), + testSuffix = "back gesture", + ), + GestureTestData( + recognizer = + HomeGestureRecognizer( + SWIPE_DISTANCE.toInt(), + THRESHOLD_VELOCITY_PX_PER_MS, + FakeVelocityTracker(velocity = FAST), + ), + validGestures = setOf(swipeUp()), + tooShortGesture = swipeUp(SWIPE_DISTANCE / 2), + testSuffix = "home gesture", + ), + GestureTestData( + recognizer = + RecentAppsGestureRecognizer( + SWIPE_DISTANCE.toInt(), + THRESHOLD_VELOCITY_PX_PER_MS, + FakeVelocityTracker(velocity = SLOW), + ), + validGestures = setOf(swipeUp()), + tooShortGesture = swipeUp(SWIPE_DISTANCE / 2), + testSuffix = "recent apps gesture", + ), + ) + .map { + arrayOf(it.recognizer, it.validGestures, it.tooShortGesture, it.testSuffix) + } + } + } + + class GestureTestData( + val recognizer: GestureRecognizer, + val validGestures: Set<List<MotionEvent>>, + val tooShortGesture: List<MotionEvent>, + val testSuffix: String, + ) +} + +private fun List<MotionEvent>.differentFromAnyOf(validGestures: Set<List<MotionEvent>>): Boolean { + // comparing MotionEvents is really hard so let's just compare their positions + val positions = this.map { it.x to it.y } + val validGesturesPositions = validGestures.map { gesture -> gesture.map { it.x to it.y } } + return !validGesturesPositions.contains(positions) +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt index 3dcb82811408..72527ddf65b1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt @@ -105,6 +105,20 @@ class ViewUtilTest : SysuiTestCase() { assertThat(outRect.top).isEqualTo(VIEW_TOP) assertThat(outRect.bottom).isEqualTo(VIEW_BOTTOM) } + + @Test + fun viewBoundsOnScreen_viewAnchoredAtOriginInWindow() { + // view is anchored at 0,0 in its window + view.setLeftTopRightBottom(0, 0, VIEW_RIGHT - VIEW_LEFT, VIEW_BOTTOM - VIEW_TOP) + + val outRect = Rect() + view.viewBoundsOnScreen(outRect) + + assertThat(outRect.left).isEqualTo(VIEW_LEFT) + assertThat(outRect.right).isEqualTo(VIEW_RIGHT) + assertThat(outRect.top).isEqualTo(VIEW_TOP) + assertThat(outRect.bottom).isEqualTo(VIEW_BOTTOM) + } } private const val VIEW_LEFT = 30 diff --git a/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml b/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml index 47641ee64ee1..4a14f3baaafc 100644 --- a/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml +++ b/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/materialColorSecondaryFixedDim"/> + <item android:color="@androidprv:color/materialColorSecondaryFixedDim"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml b/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml index 5e7cf3ee41fb..6a885a733dba 100644 --- a/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml +++ b/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml @@ -19,7 +19,7 @@ android:color="?attr/wallpaperTextColorSecondary"> <item android:id="@android:id/background"> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorTertiaryFixed"/> + <solid android:color="@androidprv:color/materialColorTertiaryFixed"/> <corners android:radius="24dp"/> </shape> </item> diff --git a/packages/SystemUI/res-keyguard/drawable/progress_bar.xml b/packages/SystemUI/res-keyguard/drawable/progress_bar.xml index 910a74ad5faf..455d9d3c00fa 100644 --- a/packages/SystemUI/res-keyguard/drawable/progress_bar.xml +++ b/packages/SystemUI/res-keyguard/drawable/progress_bar.xml @@ -26,7 +26,7 @@ android:layout_height="match_parent" android:shape="rectangle"> <corners android:radius="30dp" /> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHighest" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest" /> </shape> </item> <item diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml index 83736e9d9473..eb9ee03a2cd4 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml @@ -27,8 +27,8 @@ android:background="@drawable/kg_bouncer_secondary_button" android:drawablePadding="10dp" android:drawableStart="@drawable/ic_no_sim" - android:drawableTint="?androidprv:attr/materialColorOnSurface" + android:drawableTint="@androidprv:color/materialColorOnSurface" android:text="@string/disable_carrier_button_text" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textSize="@dimen/kg_status_line_font_size" android:visibility="gone" /> diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml index da12dd731c23..b256518e99ac 100644 --- a/packages/SystemUI/res-keyguard/values/styles.xml +++ b/packages/SystemUI/res-keyguard/values/styles.xml @@ -23,13 +23,13 @@ <style name="Keyguard.TextView" parent="@android:style/Widget.DeviceDefault.TextView"> <item name="android:textSize">@dimen/kg_status_line_font_size</item> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="Keyguard.Bouncer.PrimaryMessage" parent="Theme.SystemUI"> <item name="android:textSize">18sp</item> <item name="android:lineHeight">24dp</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:singleLine">true</item> <item name="android:textAlignment">center</item> <item name="android:ellipsize">marquee</item> @@ -41,10 +41,10 @@ <item name="android:textAlignment">center</item> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> <item name="android:ellipsize">end</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> </style> <style name="Keyguard.TextView.EmergencyButton" parent="Theme.SystemUI"> - <item name="android:textColor">?androidprv:attr/materialColorOnTertiaryFixed</item> + <item name="android:textColor">@androidprv:color/materialColorOnTertiaryFixed</item> <item name="android:textSize">16sp</item> <item name="android:background">@drawable/kg_emergency_button_background</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> diff --git a/packages/SystemUI/res-product/values/strings.xml b/packages/SystemUI/res-product/values/strings.xml index 42733a20ffae..0c29bb4b2279 100644 --- a/packages/SystemUI/res-product/values/strings.xml +++ b/packages/SystemUI/res-product/values/strings.xml @@ -179,6 +179,8 @@ <!-- Text informing the user that their media is now playing on this tablet device. [CHAR LIMIT=50] --> <string name="media_transfer_playing_this_device" product="tablet">Playing on this tablet</string> - + <!-- Message shown during shutdown when Find My Device with Dead Battery Finder is active [CHAR LIMIT=300] --> + <string name="finder_active" product="default">You can locate this phone with Find My Device even when powered off</string> + <string name="finder_active" product="tablet">You can locate this tablet with Find My Device even when powered off</string> </resources> diff --git a/packages/SystemUI/res/color/connected_network_primary_color.xml b/packages/SystemUI/res/color/connected_network_primary_color.xml index f173c8dd5473..920047a705e8 100644 --- a/packages/SystemUI/res/color/connected_network_primary_color.xml +++ b/packages/SystemUI/res/color/connected_network_primary_color.xml @@ -16,5 +16,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/materialColorOnPrimaryContainer" /> + <item android:color="@androidprv:color/materialColorOnPrimaryContainer" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/disconnected_network_primary_color.xml b/packages/SystemUI/res/color/disconnected_network_primary_color.xml index 536bf78b7b60..f4b19a71fefd 100644 --- a/packages/SystemUI/res/color/disconnected_network_primary_color.xml +++ b/packages/SystemUI/res/color/disconnected_network_primary_color.xml @@ -16,5 +16,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/materialColorPrimaryContainer" /> + <item android:color="@androidprv:color/materialColorPrimaryContainer" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/menu_item_text.xml b/packages/SystemUI/res/color/menu_item_text.xml index 0d05650b8082..c1c9e2c1938e 100644 --- a/packages/SystemUI/res/color/menu_item_text.xml +++ b/packages/SystemUI/res/color/menu_item_text.xml @@ -17,8 +17,8 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_enabled="false" - android:color="?androidprv:attr/materialColorOnSurface" + android:color="@androidprv:color/materialColorOnSurface" android:alpha="0.38" /> - <item android:color="?androidprv:attr/materialColorOnSurface"/> + <item android:color="@androidprv:color/materialColorOnSurface"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/notification_focus_overlay_color.xml b/packages/SystemUI/res/color/notification_focus_overlay_color.xml index 6a3c7a148963..55843635dee7 100644 --- a/packages/SystemUI/res/color/notification_focus_overlay_color.xml +++ b/packages/SystemUI/res/color/notification_focus_overlay_color.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:state_focused="true" android:color="?androidprv:attr/materialColorSecondary" /> + <item android:state_focused="true" android:color="@androidprv:color/materialColorSecondary" /> <item android:color="@color/transparent" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml b/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml index d1b8a064724d..e0873b887d8d 100644 --- a/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml +++ b/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_selected="true" - android:color="?androidprv:attr/materialColorOnSurfaceVariant" /> + android:color="@androidprv:color/materialColorOnSurfaceVariant" /> <item android:color="@color/notification_guts_priority_button_bg_stroke_color" /> </selector> diff --git a/packages/SystemUI/res/color/notification_guts_priority_contents.xml b/packages/SystemUI/res/color/notification_guts_priority_contents.xml index cc8c25a2d1ec..3b221e76a91d 100644 --- a/packages/SystemUI/res/color/notification_guts_priority_contents.xml +++ b/packages/SystemUI/res/color/notification_guts_priority_contents.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_selected="true" - android:color="?androidprv:attr/materialColorOnSurfaceVariant" /> + android:color="@androidprv:color/materialColorOnSurfaceVariant" /> <item android:color="@color/notification_guts_priority_button_content_color" /> </selector> diff --git a/packages/SystemUI/res/color/notification_state_color_default.xml b/packages/SystemUI/res/color/notification_state_color_default.xml index a14a7ad9d2da..9d77f604c166 100644 --- a/packages/SystemUI/res/color/notification_state_color_default.xml +++ b/packages/SystemUI/res/color/notification_state_color_default.xml @@ -19,7 +19,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <!-- Pressed state's alpha is set to 0.00 temporarily until this bug is resolved permanently b/313920497 Design intended alpha is 0.15--> - <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.00" /> - <item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.11" /> + <item android:state_pressed="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha="0.00" /> + <item android:state_hovered="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha="0.11" /> <item android:color="@color/transparent" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml index 40bab5ed08f2..898d5891b7e2 100644 --- a/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml +++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml @@ -17,7 +17,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_enabled="false" - android:color="?androidprv:attr/materialColorPrimary" + android:color="@androidprv:color/materialColorPrimary" android:alpha="0.30"/> - <item android:color="?androidprv:attr/materialColorPrimary"/> + <item android:color="@androidprv:color/materialColorPrimary"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml index f8d4af57229b..c8ab4ad88ca1 100644 --- a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml +++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_enabled="false" - android:color="?androidprv:attr/materialColorPrimaryFixed" + android:color="@androidprv:color/materialColorPrimaryFixed" android:alpha="0.30"/> - <item android:color="?androidprv:attr/materialColorPrimaryFixed"/> + <item android:color="@androidprv:color/materialColorPrimaryFixed"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml index faba8fc4c755..60b6245ca301 100644 --- a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml +++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_enabled="false" - android:color="?androidprv:attr/materialColorOnPrimaryFixed" + android:color="@androidprv:color/materialColorOnPrimaryFixed" android:alpha="0.30"/> - <item android:color="?androidprv:attr/materialColorOnPrimaryFixed"/> + <item android:color="@androidprv:color/materialColorOnPrimaryFixed"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml index e76ad991a92c..a5497a54ec66 100644 --- a/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml +++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml @@ -17,7 +17,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_enabled="false" - android:color="?androidprv:attr/materialColorOnPrimary" + android:color="@androidprv:color/materialColorOnPrimary" android:alpha="0.30"/> - <item android:color="?androidprv:attr/materialColorOnPrimary"/> + <item android:color="@androidprv:color/materialColorOnPrimary"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/qs_dialog_btn_outline.xml b/packages/SystemUI/res/color/qs_dialog_btn_outline.xml index 1adfe5b19d70..7ef7e062e579 100644 --- a/packages/SystemUI/res/color/qs_dialog_btn_outline.xml +++ b/packages/SystemUI/res/color/qs_dialog_btn_outline.xml @@ -17,7 +17,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_enabled="false" - android:color="?androidprv:attr/materialColorPrimary" + android:color="@androidprv:color/materialColorPrimary" android:alpha="0.30"/> - <item android:color="?androidprv:attr/materialColorPrimary"/> + <item android:color="@androidprv:color/materialColorPrimary"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml b/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml index 5dc994f23f2b..f139008640ad 100644 --- a/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml +++ b/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml @@ -17,7 +17,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_enabled="false" - android:color="?androidprv:attr/materialColorOnSurface" + android:color="@androidprv:color/materialColorOnSurface" android:alpha="0.30"/> - <item android:color="?androidprv:attr/materialColorOnSurface"/> + <item android:color="@androidprv:color/materialColorOnSurface"/> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/remote_input_hint.xml b/packages/SystemUI/res/color/remote_input_hint.xml index 0d90ee6b47c6..75d2bb8f2dfe 100644 --- a/packages/SystemUI/res/color/remote_input_hint.xml +++ b/packages/SystemUI/res/color/remote_input_hint.xml @@ -16,5 +16,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/materialColorOnSurfaceVariant" android:alpha=".6" /> + <item android:color="@androidprv:color/materialColorOnSurfaceVariant" android:alpha=".6" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/remote_input_send.xml b/packages/SystemUI/res/color/remote_input_send.xml index 0acc66b9050f..4c61c0c69ca1 100644 --- a/packages/SystemUI/res/color/remote_input_send.xml +++ b/packages/SystemUI/res/color/remote_input_send.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:state_enabled="false" android:color="?androidprv:attr/materialColorPrimary" android:alpha=".3" /> - <item android:color="?androidprv:attr/materialColorPrimary" /> + <item android:state_enabled="false" android:color="@androidprv:color/materialColorPrimary" android:alpha=".3" /> + <item android:color="@androidprv:color/materialColorPrimary" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/remote_input_text.xml b/packages/SystemUI/res/color/remote_input_text.xml index bf2c198fe540..2ec09cde26ca 100644 --- a/packages/SystemUI/res/color/remote_input_text.xml +++ b/packages/SystemUI/res/color/remote_input_text.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:state_enabled="false" android:color="?androidprv:attr/materialColorOnSurfaceVariant" android:alpha=".6" /> - <item android:color="?androidprv:attr/materialColorOnSurfaceVariant" /> + <item android:state_enabled="false" android:color="@androidprv:color/materialColorOnSurfaceVariant" android:alpha=".6" /> + <item android:color="@androidprv:color/materialColorOnSurfaceVariant" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/screenshare_options_spinner_background.xml b/packages/SystemUI/res/color/screenshare_options_spinner_background.xml index 922813dcbe64..f3059f6e4627 100644 --- a/packages/SystemUI/res/color/screenshare_options_spinner_background.xml +++ b/packages/SystemUI/res/color/screenshare_options_spinner_background.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item android:state_hovered="false" android:state_focused="false" android:color="@android:color/transparent" /> - <item android:state_focused="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha=".1" /> - <item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha=".08" /> + <item android:state_focused="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha=".1" /> + <item android:state_hovered="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha=".08" /> </selector> diff --git a/packages/SystemUI/res/color/slider_active_track_color.xml b/packages/SystemUI/res/color/slider_active_track_color.xml index a5aa58dd6b51..8ba5e4901a7a 100644 --- a/packages/SystemUI/res/color/slider_active_track_color.xml +++ b/packages/SystemUI/res/color/slider_active_track_color.xml @@ -14,6 +14,6 @@ ~ limitations under the License. --> <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/materialColorPrimary" android:state_enabled="true" /> - <item android:color="?androidprv:attr/materialColorSurfaceContainerHighest" /> + <item android:color="@androidprv:color/materialColorPrimary" android:state_enabled="true" /> + <item android:color="@androidprv:color/materialColorSurfaceContainerHighest" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/slider_inactive_track_color.xml b/packages/SystemUI/res/color/slider_inactive_track_color.xml index 89aef776c00e..7980f804a516 100644 --- a/packages/SystemUI/res/color/slider_inactive_track_color.xml +++ b/packages/SystemUI/res/color/slider_inactive_track_color.xml @@ -14,6 +14,6 @@ ~ limitations under the License. --> <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/materialColorSurfaceContainerHighest" android:state_enabled="true" /> - <item android:color="?androidprv:attr/materialColorPrimary" /> + <item android:color="@androidprv:color/materialColorSurfaceContainerHighest" android:state_enabled="true" /> + <item android:color="@androidprv:color/materialColorPrimary" /> </selector>
\ No newline at end of file diff --git a/packages/SystemUI/res/color/slider_thumb_color.xml b/packages/SystemUI/res/color/slider_thumb_color.xml index 5206049edd41..8a98902426f8 100644 --- a/packages/SystemUI/res/color/slider_thumb_color.xml +++ b/packages/SystemUI/res/color/slider_thumb_color.xml @@ -15,6 +15,6 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/materialColorSurfaceContainerHighest" android:state_enabled="false" /> - <item android:color="?androidprv:attr/materialColorPrimary" /> + <item android:color="@androidprv:color/materialColorSurfaceContainerHighest" android:state_enabled="false" /> + <item android:color="@androidprv:color/materialColorPrimary" /> </selector> diff --git a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml index 16076b17a6e5..d54164be4632 100644 --- a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml +++ b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml @@ -24,8 +24,8 @@ android:viewportHeight="24"> <path android:pathData="M0,12C0,5.373 5.373,0 12,0C18.627,0 24,5.373 24,12C24,18.627 18.627,24 12,24C5.373,24 0,18.627 0,12Z" - android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/> + android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/> <path android:pathData="M7.607,9.059L6.667,9.999L12,15.332L17.333,9.999L16.393,9.059L12,13.445" - android:fillColor="?androidprv:attr/materialColorOnSurface"/> + android:fillColor="@androidprv:color/materialColorOnSurface"/> </vector> diff --git a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml index 309770ddd76d..81184a111d25 100644 --- a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml +++ b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml @@ -24,8 +24,8 @@ android:viewportHeight="24"> <path android:pathData="M0,12C0,5.3726 5.3726,0 12,0C18.6274,0 24,5.3726 24,12C24,18.6274 18.6274,24 12,24C5.3726,24 0,18.6274 0,12Z" - android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/> + android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/> <path android:pathData="M16.3934,14.9393L17.3334,13.9993L12.0001,8.666L6.6667,13.9993L7.6068,14.9393L12.0001,10.5527" - android:fillColor="?androidprv:attr/materialColorOnSurface"/> + android:fillColor="@androidprv:color/materialColorOnSurface"/> </vector> diff --git a/packages/SystemUI/res/drawable/action_chip_background.xml b/packages/SystemUI/res/drawable/action_chip_background.xml index 9492472a2be1..0958c840994d 100644 --- a/packages/SystemUI/res/drawable/action_chip_background.xml +++ b/packages/SystemUI/res/drawable/action_chip_background.xml @@ -20,7 +20,7 @@ android:color="@color/overlay_button_ripple"> <item android:id="@android:id/background"> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSecondary"/> + <solid android:color="@androidprv:color/materialColorSecondary"/> <corners android:radius="@dimen/overlay_button_corner_radius"/> </shape> </item> diff --git a/packages/SystemUI/res/drawable/action_chip_container_background.xml b/packages/SystemUI/res/drawable/action_chip_container_background.xml index 2ee27107d900..5aced9d424fa 100644 --- a/packages/SystemUI/res/drawable/action_chip_container_background.xml +++ b/packages/SystemUI/res/drawable/action_chip_container_background.xml @@ -18,6 +18,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceBright"/> + <solid android:color="@androidprv:color/materialColorSurfaceBright"/> <corners android:radius="@dimen/overlay_action_container_corner_radius"/> </shape> diff --git a/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml b/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml index fdafe6d8e335..63d026842234 100644 --- a/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml +++ b/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml @@ -18,6 +18,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/> <corners android:radius="@dimen/biometric_prompt_content_corner_radius"/> </shape> diff --git a/packages/SystemUI/res/drawable/brightness_bar.xml b/packages/SystemUI/res/drawable/brightness_bar.xml index 3d1c1fbd6ce7..a32496b25041 100644 --- a/packages/SystemUI/res/drawable/brightness_bar.xml +++ b/packages/SystemUI/res/drawable/brightness_bar.xml @@ -21,7 +21,7 @@ android:viewportHeight="48"> <path android:pathData="M2,22L302,22A2,2 0,0 1,304 24L304,24A2,2 0,0 1,302 26L2,26A2,2 0,0 1,0 24L0,24A2,2 0,0 1,2 22z" - android:fillColor="?androidprv:attr/customColorShadeInactive"/> + android:fillColor="@androidprv:color/customColorShadeInactive"/> <path android:pathData="M24,0L205.71,0A24,24 0,0 1,229.71 24L229.71,24A24,24 0,0 1,205.71 48L24,48A24,24 0,0 1,0 24L0,24A24,24 0,0 1,24 0z" android:fillColor="?attr/shadeActive"/> diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml index ec15b10851c5..88d3ecb3f423 100644 --- a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml +++ b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml @@ -25,7 +25,7 @@ <shape> <size android:height="@dimen/rounded_slider_track_width" /> <corners android:radius="@dimen/rounded_slider_track_corner_radius" /> - <solid android:color="?androidprv:attr/customColorShadeInactive" /> + <solid android:color="@androidprv:color/customColorShadeInactive" /> </shape> </inset> </item> diff --git a/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml b/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml index 22406ec52d00..546289837e8f 100644 --- a/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml +++ b/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml @@ -22,7 +22,7 @@ <inset android:inset="-5dp"> <shape> <corners android:radius="16dp"/> - <stroke android:width="3dp" android:color="?androidprv:attr/materialColorSecondaryFixed"/> + <stroke android:width="3dp" android:color="@androidprv:color/materialColorSecondaryFixed"/> </shape> </inset> </item> diff --git a/packages/SystemUI/res/drawable/chipbar_background.xml b/packages/SystemUI/res/drawable/chipbar_background.xml index 7530f5ba244a..15c9fcb1370a 100644 --- a/packages/SystemUI/res/drawable/chipbar_background.xml +++ b/packages/SystemUI/res/drawable/chipbar_background.xml @@ -17,6 +17,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <solid android:color="?androidprv:attr/materialColorSecondaryFixed" /> + <solid android:color="@androidprv:color/materialColorSecondaryFixed" /> <corners android:radius="32dp" /> </shape> diff --git a/packages/SystemUI/res/drawable/chipbar_end_button_background.xml b/packages/SystemUI/res/drawable/chipbar_end_button_background.xml index a3832eef957f..fcf5b30f6211 100644 --- a/packages/SystemUI/res/drawable/chipbar_end_button_background.xml +++ b/packages/SystemUI/res/drawable/chipbar_end_button_background.xml @@ -20,7 +20,7 @@ android:color="?android:textColorPrimary"> <item android:id="@android:id/background"> <shape> - <solid android:color="?androidprv:attr/materialColorPrimaryFixedDim"/> + <solid android:color="@androidprv:color/materialColorPrimaryFixedDim"/> <corners android:radius="24dp" /> </shape> </item> diff --git a/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml b/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml index d7000d7f5a5c..b8911637f300 100644 --- a/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml +++ b/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml @@ -19,6 +19,6 @@ android:insetBottom="@dimen/contextual_edu_dialog_elevation"> <shape> <corners android:radius="28dp" /> - <solid android:color="?androidprv:attr/materialColorTertiaryFixed" /> + <solid android:color="@androidprv:color/materialColorTertiaryFixed" /> </shape> </inset>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml b/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml index f35975ee8548..5ddc860f85a2 100644 --- a/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml +++ b/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml @@ -18,5 +18,5 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> <corners android:radius="@dimen/hearing_devices_preset_spinner_background_radius"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainer" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml b/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml index 16e2a3db2e95..307f7eb8f17e 100644 --- a/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml @@ -18,7 +18,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:width="24dp" android:height="24dp" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" android:viewportHeight="24" android:viewportWidth="24"> <path diff --git a/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml b/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml index 82fa4f08d0c8..8304fd5be16e 100644 --- a/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml @@ -18,7 +18,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:width="24dp" android:height="24dp" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" android:viewportHeight="24" android:viewportWidth="24"> <path diff --git a/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml b/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml index 0406f0e4304e..ddff88484796 100644 --- a/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml +++ b/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml @@ -19,7 +19,7 @@ android:height="24dp" android:viewportWidth="48" android:viewportHeight="48" - android:tint="?androidprv:attr/materialColorOnSurfaceVariant"> + android:tint="@androidprv:color/materialColorOnSurfaceVariant"> <path android:fillColor="@android:color/white" android:strokeColor="@android:color/white" diff --git a/packages/SystemUI/res/drawable/immersive_cling_bg.xml b/packages/SystemUI/res/drawable/immersive_cling_bg.xml index de29c32390e1..b28a423ea06b 100644 --- a/packages/SystemUI/res/drawable/immersive_cling_bg.xml +++ b/packages/SystemUI/res/drawable/immersive_cling_bg.xml @@ -20,5 +20,5 @@ <corners android:bottomLeftRadius="28dp" android:bottomRightRadius="28dp"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainer" /> </shape> diff --git a/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml b/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml index 32dc4b335f7e..6ad46d837acd 100644 --- a/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml +++ b/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml @@ -20,7 +20,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/> <size android:width="@dimen/keyguard_affordance_fixed_width" android:height="@dimen/keyguard_affordance_fixed_height"/> diff --git a/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml b/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml index fe76ba7e5b8c..fab0cc204e87 100644 --- a/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml +++ b/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml @@ -26,7 +26,7 @@ </item> <item> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSecondaryFixed" /> + <solid android:color="@androidprv:color/materialColorSecondaryFixed" /> <corners android:radius="@dimen/keyguard_affordance_fixed_radius" /> </shape> </item> diff --git a/packages/SystemUI/res/drawable/notif_footer_btn_background.xml b/packages/SystemUI/res/drawable/notif_footer_btn_background.xml index b9597375c3df..1d5e09d9b260 100644 --- a/packages/SystemUI/res/drawable/notif_footer_btn_background.xml +++ b/packages/SystemUI/res/drawable/notif_footer_btn_background.xml @@ -26,7 +26,7 @@ <padding android:left="20dp" android:right="20dp" /> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> </shape> </inset> </item> diff --git a/packages/SystemUI/res/drawable/notification_guts_bg.xml b/packages/SystemUI/res/drawable/notification_guts_bg.xml index 84e2231738d4..200976b1fb31 100644 --- a/packages/SystemUI/res/drawable/notification_guts_bg.xml +++ b/packages/SystemUI/res/drawable/notification_guts_bg.xml @@ -17,7 +17,7 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> <!--The radius is 1dp smaller than the notification one, to avoid aliasing bugs on the corners --> <corners android:radius="1dp" /> </shape> diff --git a/packages/SystemUI/res/drawable/notification_material_bg.xml b/packages/SystemUI/res/drawable/notification_material_bg.xml index 715be074eaa8..db3b969cca39 100644 --- a/packages/SystemUI/res/drawable/notification_material_bg.xml +++ b/packages/SystemUI/res/drawable/notification_material_bg.xml @@ -20,7 +20,7 @@ android:color="?android:attr/colorControlHighlight"> <item> <shape> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" /> </shape> </item> <item> diff --git a/packages/SystemUI/res/drawable/overlay_border.xml b/packages/SystemUI/res/drawable/overlay_border.xml index a59f9239dfca..381849be5730 100644 --- a/packages/SystemUI/res/drawable/overlay_border.xml +++ b/packages/SystemUI/res/drawable/overlay_border.xml @@ -18,6 +18,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceBright"/> + <solid android:color="@androidprv:color/materialColorSurfaceBright"/> <corners android:radius="16dp"/> </shape> diff --git a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml index f8b99f4a0ee4..299b4c9ab1d0 100644 --- a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml +++ b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml @@ -23,8 +23,8 @@ android:viewportHeight="24"> <path android:pathData="M0,12C0,5.373 5.373,0 12,0C18.627,0 24,5.373 24,12C24,18.627 18.627,24 12,24C5.373,24 0,18.627 0,12Z" - android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/> + android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/> <path android:pathData="M7.607,9.059L6.667,9.999L12,15.332L17.333,9.999L16.393,9.059L12,13.445" - android:fillColor="?androidprv:attr/materialColorOnSurface"/> + android:fillColor="@androidprv:color/materialColorOnSurface"/> </vector> diff --git a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml index ae60d517ceb4..68e73e941e00 100644 --- a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml +++ b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml @@ -23,8 +23,8 @@ android:viewportHeight="24"> <path android:pathData="M0,12C0,5.3726 5.3726,0 12,0C18.6274,0 24,5.3726 24,12C24,18.6274 18.6274,24 12,24C5.3726,24 0,18.6274 0,12Z" - android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/> + android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/> <path android:pathData="M16.3934,14.9393L17.3334,13.9993L12.0001,8.666L6.6667,13.9993L7.6068,14.9393L12.0001,10.5527" - android:fillColor="?androidprv:attr/materialColorOnSurface"/> + android:fillColor="@androidprv:color/materialColorOnSurface"/> </vector> diff --git a/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml b/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml index 3c1668405909..e90473bf54f3 100644 --- a/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml +++ b/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml @@ -21,7 +21,7 @@ android:color="?android:attr/colorControlHighlight"> <item> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorPrimaryContainer"/> + <solid android:color="@androidprv:color/materialColorPrimaryContainer"/> <corners android:radius="@dimen/hearing_devices_preset_spinner_background_radius"/> </shape> </item> diff --git a/packages/SystemUI/res/drawable/qs_tile_focused_background.xml b/packages/SystemUI/res/drawable/qs_tile_focused_background.xml index 33f0d02efb2a..cdf6a1a00316 100644 --- a/packages/SystemUI/res/drawable/qs_tile_focused_background.xml +++ b/packages/SystemUI/res/drawable/qs_tile_focused_background.xml @@ -21,6 +21,6 @@ <corners android:radius="30dp" /> <stroke android:width="3dp" - android:color="?androidprv:attr/materialColorSecondaryFixed" /> + android:color="@androidprv:color/materialColorSecondaryFixed" /> </shape> </inset>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml b/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml index 45d1a530cd20..01ecbcf9956b 100644 --- a/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml +++ b/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml @@ -17,10 +17,10 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceDim" /> + <solid android:color="@androidprv:color/materialColorSurfaceDim" /> <stroke android:width="@dimen/remote_input_view_text_stroke" - android:color="?androidprv:attr/materialColorPrimary"/> + android:color="@androidprv:color/materialColorPrimary"/> <padding android:bottom="0dp" android:left="12dp" diff --git a/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml b/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml index 321a04a1fb5e..323cb77eb37f 100644 --- a/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml +++ b/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml @@ -17,5 +17,5 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> <corners android:radius="@dimen/screenrecord_spinner_background_radius"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainer" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainer" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/screenshot_edit_background.xml b/packages/SystemUI/res/drawable/screenshot_edit_background.xml index 07e5aff3954d..ef1c30f10605 100644 --- a/packages/SystemUI/res/drawable/screenshot_edit_background.xml +++ b/packages/SystemUI/res/drawable/screenshot_edit_background.xml @@ -20,7 +20,7 @@ android:color="@color/overlay_button_ripple"> <item android:id="@android:id/background"> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSecondaryFixedDim"/> + <solid android:color="@androidprv:color/materialColorSecondaryFixedDim"/> <corners android:radius="16dp"/> </shape> </item> diff --git a/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml b/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml index fab2d8db859f..2063d9fa55e0 100644 --- a/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml +++ b/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml @@ -20,7 +20,7 @@ android:color="?android:attr/colorControlHighlight"> <item> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorPrimaryContainer"/> + <solid android:color="@androidprv:color/materialColorPrimaryContainer"/> <corners android:radius="@dimen/settingslib_switch_bar_radius"/> </shape> </item> diff --git a/packages/SystemUI/res/drawable/settingslib_thumb_on.xml b/packages/SystemUI/res/drawable/settingslib_thumb_on.xml index e316a93c1c3d..70a1e84e7e40 100644 --- a/packages/SystemUI/res/drawable/settingslib_thumb_on.xml +++ b/packages/SystemUI/res/drawable/settingslib_thumb_on.xml @@ -24,7 +24,7 @@ <size android:height="@dimen/settingslib_switch_thumb_size" android:width="@dimen/settingslib_switch_thumb_size"/> - <solid android:color="?androidprv:attr/materialColorOnPrimary"/> + <solid android:color="@androidprv:color/materialColorOnPrimary"/> </shape> </item> </layer-list> diff --git a/packages/SystemUI/res/drawable/settingslib_track_on_background.xml b/packages/SystemUI/res/drawable/settingslib_track_on_background.xml index e2e64684f9c3..e3476a42b2bc 100644 --- a/packages/SystemUI/res/drawable/settingslib_track_on_background.xml +++ b/packages/SystemUI/res/drawable/settingslib_track_on_background.xml @@ -22,6 +22,6 @@ android:height="@dimen/settingslib_switch_track_height"> <padding android:left="@dimen/settingslib_switch_thumb_margin" android:right="@dimen/settingslib_switch_thumb_margin"/> - <solid android:color="?androidprv:attr/materialColorPrimary"/> + <solid android:color="@androidprv:color/materialColorPrimary"/> <corners android:radius="@dimen/settingslib_switch_track_radius"/> </shape> diff --git a/packages/SystemUI/res/drawable/shelf_action_chip_background.xml b/packages/SystemUI/res/drawable/shelf_action_chip_background.xml index 63600beff126..faa3d6869a34 100644 --- a/packages/SystemUI/res/drawable/shelf_action_chip_background.xml +++ b/packages/SystemUI/res/drawable/shelf_action_chip_background.xml @@ -20,7 +20,7 @@ android:color="@color/overlay_button_ripple"> <item android:id="@android:id/background"> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSecondary"/> + <solid android:color="@androidprv:color/materialColorSecondary"/> <corners android:radius="10000dp"/> <!-- fully-rounded radius --> </shape> </item> diff --git a/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml b/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml index ad6c154692ec..82f034bb1cdd 100644 --- a/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml +++ b/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml @@ -21,7 +21,7 @@ <shape xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceBright"/> + <solid android:color="@androidprv:color/materialColorSurfaceBright"/> <corners android:radius="10000dp"/> <!-- fully-rounded radius --> </shape> </inset>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/shortcut_button_colored.xml b/packages/SystemUI/res/drawable/shortcut_button_colored.xml index 2e2d9b9a3e35..b6a14c8188ab 100644 --- a/packages/SystemUI/res/drawable/shortcut_button_colored.xml +++ b/packages/SystemUI/res/drawable/shortcut_button_colored.xml @@ -22,7 +22,7 @@ <item> <shape android:shape="rectangle"> <corners android:radius="@dimen/ksh_button_corner_radius"/> - <solid android:color="?androidprv:attr/materialColorSurfaceBright"/> + <solid android:color="@androidprv:color/materialColorSurfaceBright"/> </shape> </item> </ripple> diff --git a/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml b/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml index 5b88bb922a9e..2b95a9462365 100644 --- a/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml +++ b/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml @@ -22,7 +22,7 @@ <item> <shape android:shape="rectangle"> <corners android:radius="@dimen/ksh_button_corner_radius"/> - <solid android:color="?androidprv:attr/materialColorPrimary"/> + <solid android:color="@androidprv:color/materialColorPrimary"/> </shape> </item> </ripple> diff --git a/packages/SystemUI/res/drawable/shortcut_search_background.xml b/packages/SystemUI/res/drawable/shortcut_search_background.xml index d6847f0abb8d..07e5b3dec059 100644 --- a/packages/SystemUI/res/drawable/shortcut_search_background.xml +++ b/packages/SystemUI/res/drawable/shortcut_search_background.xml @@ -19,7 +19,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item> <shape android:shape="rectangle"> - <solid android:color="?androidprv:attr/materialColorSurfaceBright" /> + <solid android:color="@androidprv:color/materialColorSurfaceBright" /> <corners android:radius="@dimen/ksh_search_box_corner_radius" /> </shape> </item> diff --git a/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml b/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml index 2675906580f1..6390c11dae36 100644 --- a/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml +++ b/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml @@ -20,7 +20,7 @@ <shape android:shape="oval"> <size android:width="24dp" android:height="24dp" /> - <solid android:color="?androidprv:attr/materialColorSurfaceBright"/> + <solid android:color="@androidprv:color/materialColorSurfaceBright"/> </shape> </item> </ripple> diff --git a/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml b/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml index 06bed001ae1a..42a5d305fb65 100644 --- a/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml +++ b/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml @@ -21,6 +21,6 @@ android:viewportWidth="40" android:viewportHeight="40"> <path - android:fillColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:fillColor="@androidprv:color/materialColorOnSurfaceVariant" android:pathData="M24.6667 16.2733L23.7267 15.3333L20 19.06L16.2734 15.3333L15.3334 16.2733L19.06 20L15.3334 23.7267L16.2734 24.6667L20 20.94L23.7267 24.6667L24.6667 23.7267L20.94 20L24.6667 16.2733Z"/> </vector> diff --git a/packages/SystemUI/res/drawable/volume_background_top.xml b/packages/SystemUI/res/drawable/volume_background_top.xml index 132572a41a36..7185d03a9910 100644 --- a/packages/SystemUI/res/drawable/volume_background_top.xml +++ b/packages/SystemUI/res/drawable/volume_background_top.xml @@ -17,7 +17,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <item> <shape> - <solid android:color="?androidprv:attr/materialColorSurface" /> + <solid android:color="@androidprv:color/materialColorSurface" /> <corners android:topLeftRadius="@dimen/volume_dialog_background_corner_radius" android:topRightRadius="@dimen/volume_dialog_background_corner_radius"/> </shape> diff --git a/packages/SystemUI/res/drawable/volume_dialog_background.xml b/packages/SystemUI/res/drawable/volume_dialog_background.xml index 7d7498feeba6..25d78e3474d5 100644 --- a/packages/SystemUI/res/drawable/volume_dialog_background.xml +++ b/packages/SystemUI/res/drawable/volume_dialog_background.xml @@ -18,5 +18,5 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> <corners android:radius="@dimen/volume_dialog_background_corner_radius" /> - <solid android:color="?androidprv:attr/materialColorSurface" /> + <solid android:color="@androidprv:color/materialColorSurface" /> </shape> diff --git a/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml b/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml index 7d794966c480..9026d64aa969 100644 --- a/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml +++ b/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml @@ -17,5 +17,5 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> <corners android:radius="@dimen/volume_dialog_background_square_corner_radius" /> - <solid android:color="?androidprv:attr/materialColorSurface" /> + <solid android:color="@androidprv:color/materialColorSurface" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml b/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml index 131201e7a94f..555eebd77b1e 100644 --- a/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml +++ b/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml @@ -19,6 +19,6 @@ <size android:height="@dimen/volume_dialog_ringer_drawer_button_size" android:width="@dimen/volume_dialog_ringer_drawer_button_size" /> - <solid android:color="?androidprv:attr/materialColorPrimary" /> + <solid android:color="@androidprv:color/materialColorPrimary" /> <corners android:radius="@dimen/volume_dialog_ringer_selected_button_background_radius" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml b/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml index a8c9818b58a3..4b3edb905dca 100644 --- a/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml +++ b/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml @@ -17,6 +17,6 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle" > <size android:width="@dimen/volume_dialog_ringer_drawer_button_size" android:height="@dimen/volume_dialog_ringer_drawer_button_size"/> - <solid android:color="?androidprv:attr/materialColorSurfaceContainerHighest" /> + <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest" /> <corners android:radius="@dimen/volume_dialog_background_square_corner_radius" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/volume_row_seekbar.xml b/packages/SystemUI/res/drawable/volume_row_seekbar.xml index d7d75d4304d0..c47d7c0e8eb1 100644 --- a/packages/SystemUI/res/drawable/volume_row_seekbar.xml +++ b/packages/SystemUI/res/drawable/volume_row_seekbar.xml @@ -26,7 +26,7 @@ <shape> <size android:height="@dimen/volume_dialog_track_width" /> <corners android:radius="@dimen/volume_dialog_panel_width_half" /> - <solid android:color="?androidprv:attr/materialColorOutlineVariant" /> + <solid android:color="@androidprv:color/materialColorOutlineVariant" /> </shape> </item> <item android:id="@android:id/progress" diff --git a/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml b/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml index ca7df86d8296..3e53bf45cff8 100644 --- a/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml +++ b/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml @@ -42,7 +42,7 @@ android:layout_marginBottom="16dp" android:scaleType="fitCenter" android:src="@null" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" /> <TextView diff --git a/packages/SystemUI/res/layout/app_clips_screenshot.xml b/packages/SystemUI/res/layout/app_clips_screenshot.xml index 7b7c96cb0322..afc58cc8e163 100644 --- a/packages/SystemUI/res/layout/app_clips_screenshot.xml +++ b/packages/SystemUI/res/layout/app_clips_screenshot.xml @@ -31,10 +31,10 @@ android:layout_height="48dp" android:layout_marginStart="8dp" android:background="@drawable/overlay_button_background" - android:backgroundTint="?androidprv:attr/materialColorPrimary" + android:backgroundTint="@androidprv:color/materialColorPrimary" android:paddingHorizontal="24dp" android:text="@string/app_clips_save_add_to_note" - android:textColor="?androidprv:attr/materialColorOnPrimary" + android:textColor="@androidprv:color/materialColorOnPrimary" app:layout_constraintBottom_toTopOf="@id/preview" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -61,7 +61,7 @@ android:button="@drawable/checkbox_circle_shape" android:checked="true" android:text="@string/backlinks_include_link" - android:textColor="?androidprv:attr/materialColorOnBackground" + android:textColor="@androidprv:color/materialColorOnBackground" android:visibility="gone" app:layout_constraintBottom_toTopOf="@id/preview" app:layout_constraintStart_toEndOf="@id/cancel" @@ -89,11 +89,11 @@ android:layout_marginStart="8dp" android:drawablePadding="4dp" android:drawableStart="@drawable/ic_info_outline" - android:drawableTint="?androidprv:attr/materialColorOnBackground" + android:drawableTint="@androidprv:color/materialColorOnBackground" android:gravity="center" android:paddingHorizontal="8dp" android:text="@string/backlinks_cross_profile_error" - android:textColor="?androidprv:attr/materialColorOnBackground" + android:textColor="@androidprv:color/materialColorOnBackground" android:visibility="gone" app:layout_constraintBottom_toTopOf="@id/preview" app:layout_constraintStart_toEndOf="@id/backlinks_data" diff --git a/packages/SystemUI/res/layout/bundle_notification_info.xml b/packages/SystemUI/res/layout/bundle_notification_info.xml index 8700832c0eb0..745066a7bdbb 100644 --- a/packages/SystemUI/res/layout/bundle_notification_info.xml +++ b/packages/SystemUI/res/layout/bundle_notification_info.xml @@ -103,7 +103,7 @@ asked for it --> android:contentDescription="@string/notification_app_settings" android:src="@drawable/ic_info" android:layout_toStartOf="@id/info" - android:tint="?androidprv:attr/materialColorPrimary"/> + android:tint="@androidprv:color/materialColorPrimary"/> <ImageButton android:id="@+id/info" android:layout_width="@dimen/notification_importance_toggle_size" @@ -112,7 +112,7 @@ asked for it --> android:contentDescription="@string/notification_more_settings" android:background="@drawable/ripple_drawable_20dp" android:src="@drawable/ic_settings" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" android:layout_alignParentEnd="true" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/chipbar.xml b/packages/SystemUI/res/layout/chipbar.xml index e1b8ab469765..2fecf79e926e 100644 --- a/packages/SystemUI/res/layout/chipbar.xml +++ b/packages/SystemUI/res/layout/chipbar.xml @@ -56,10 +56,10 @@ android:layout_height="wrap_content" android:layout_weight="1" style="@style/Chipbar.Text" - android:textColor="?androidprv:attr/materialColorOnSecondaryFixed" + android:textColor="@androidprv:color/materialColorOnSecondaryFixed" android:alpha="0.0" /> - <!-- LINT.ThenChange(systemui.temporarydisplay.chipbar.ChipbarInfo.kt) --> + <!-- LINT.ThenChange(/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt) --> <!-- At most one of [loading, failure_icon, undo] will be visible at a time. --> <ImageView @@ -68,7 +68,7 @@ android:layout_height="@dimen/chipbar_end_icon_size" android:layout_marginStart="@dimen/chipbar_end_item_start_margin" android:src="@drawable/ic_progress_activity" - android:tint="?androidprv:attr/materialColorOnSecondaryFixedVariant" + android:tint="@androidprv:color/materialColorOnSecondaryFixedVariant" android:alpha="0.0" /> @@ -88,7 +88,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/chipbar_end_item_start_margin" style="@style/Chipbar.Text" - android:textColor="?androidprv:attr/materialColorOnPrimaryFixed" + android:textColor="@androidprv:color/materialColorOnPrimaryFixed" android:paddingStart="@dimen/chipbar_outer_padding" android:paddingEnd="@dimen/chipbar_outer_padding" android:paddingTop="@dimen/chipbar_end_button_vertical_padding" diff --git a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml index 14b3b55df0a4..3378dcced537 100644 --- a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml +++ b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml @@ -17,8 +17,8 @@ android:paddingHorizontal="16dp" android:background="@drawable/overlay_button_background" android:text="@string/clipboard_edit_text_done" - android:backgroundTint="?androidprv:attr/materialColorPrimary" - android:textColor="?androidprv:attr/materialColorOnPrimary" + android:backgroundTint="@androidprv:color/materialColorPrimary" + android:textColor="@androidprv:color/materialColorOnPrimary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/packages/SystemUI/res/layout/clipboard_overlay.xml b/packages/SystemUI/res/layout/clipboard_overlay.xml index 572f063c20c4..448b3e7d5ea0 100644 --- a/packages/SystemUI/res/layout/clipboard_overlay.xml +++ b/packages/SystemUI/res/layout/clipboard_overlay.xml @@ -222,8 +222,8 @@ android:layout_height="match_parent" android:layout_margin="@dimen/overlay_dismiss_button_margin" android:background="@drawable/circular_background" - android:backgroundTint="?androidprv:attr/materialColorPrimaryFixedDim" - android:tint="?androidprv:attr/materialColorOnPrimaryFixed" + android:backgroundTint="@androidprv:color/materialColorPrimaryFixedDim" + android:tint="@androidprv:color/materialColorOnPrimaryFixed" android:padding="4dp" android:src="@drawable/ic_close"/> </FrameLayout> diff --git a/packages/SystemUI/res/layout/connected_display_dialog.xml b/packages/SystemUI/res/layout/connected_display_dialog.xml index a71782b0a109..b22355551fe3 100644 --- a/packages/SystemUI/res/layout/connected_display_dialog.xml +++ b/packages/SystemUI/res/layout/connected_display_dialog.xml @@ -30,11 +30,11 @@ android:layout_width="@dimen/connected_display_dialog_logo_size" android:layout_height="@dimen/connected_display_dialog_logo_size" android:background="@drawable/circular_background" - android:backgroundTint="?androidprv:attr/materialColorSecondary" + android:backgroundTint="@androidprv:color/materialColorSecondary" android:importantForAccessibility="no" android:padding="6dp" android:src="@drawable/stat_sys_connected_display" - android:tint="?androidprv:attr/materialColorOnSecondary" /> + android:tint="@androidprv:color/materialColorOnSecondary" /> <TextView android:id="@+id/connected_display_dialog_title" diff --git a/packages/SystemUI/res/layout/contextual_edu_dialog.xml b/packages/SystemUI/res/layout/contextual_edu_dialog.xml index 7eb6efe4afa4..09aa8daa217e 100644 --- a/packages/SystemUI/res/layout/contextual_edu_dialog.xml +++ b/packages/SystemUI/res/layout/contextual_edu_dialog.xml @@ -39,6 +39,7 @@ android:ellipsize="end" android:fontFamily="google-sans-medium" android:maxWidth="280dp" - android:textColor="?androidprv:attr/materialColorOnTertiaryFixed" - android:textSize="14sp" /> + android:textColor="@androidprv:color/materialColorOnTertiaryFixed" + android:textSize="14sp" + android:textStyle="bold" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml b/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml index 70f2cd5fcc28..2d799ae34575 100644 --- a/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml +++ b/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml @@ -28,7 +28,7 @@ android:layout_height="@dimen/hearing_devices_preset_spinner_icon_size" android:layout_gravity="center_vertical" android:layout_marginEnd="@dimen/hearing_devices_layout_margin" - android:tint="?androidprv:attr/materialColorOnPrimaryContainer" + android:tint="@androidprv:color/materialColorOnPrimaryContainer" android:src="@drawable/ic_check" android:contentDescription="@string/hearing_devices_spinner_item_selected"/> <TextView diff --git a/packages/SystemUI/res/layout/immersive_mode_cling.xml b/packages/SystemUI/res/layout/immersive_mode_cling.xml index 20b7cd3add4b..f12cf96c5597 100644 --- a/packages/SystemUI/res/layout/immersive_mode_cling.xml +++ b/packages/SystemUI/res/layout/immersive_mode_cling.xml @@ -42,7 +42,7 @@ android:layout_marginTop="20dp" android:gravity="center_horizontal" android:text="@string/immersive_cling_title" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textSize="24sp" android:fontFamily="google-sans" /> @@ -54,7 +54,7 @@ android:paddingTop="14dp" android:gravity="center_horizontal" android:text="@string/immersive_cling_description" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:textSize="14sp" android:fontFamily="google-sans" /> @@ -72,7 +72,7 @@ android:minWidth="48dp" android:minHeight="48dp" android:text="@string/immersive_cling_positive" - android:textColor="?androidprv:attr/materialColorOnPrimary" + android:textColor="@androidprv:color/materialColorOnPrimary" android:textAllCaps="false" android:textSize="14sp" android:textFontWeight="500" diff --git a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml index 5ab23271922c..4a40dda4a9a8 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml @@ -40,7 +40,7 @@ android:layout_height="wrap_content" android:paddingEnd="12dp" android:paddingBottom="4dp" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="16sp" android:maxLines="5" diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml index 6e7fde68ca04..3e69a6655a27 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml @@ -21,7 +21,7 @@ android:layout_height="match_parent" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="14sp" - android:textColor="?androidprv:attr/materialColorPrimary" + android:textColor="@androidprv:color/materialColorPrimary" android:importantForAccessibility="yes" android:paddingTop="20dp" android:paddingBottom="10dp"/> diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml index 8772a732e829..5bba9ba21759 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml @@ -22,7 +22,7 @@ android:layout_marginLeft="0dp" android:layout_marginRight="0dp" android:text="@string/keyboard_shortcut_join" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:singleLine="true" android:gravity="center" android:textSize="@dimen/ksh_item_text_size" /> diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml index 42bbf25d6c26..91558fdadb36 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml @@ -25,7 +25,7 @@ android:paddingBottom="@dimen/ksh_key_view_padding_vertical" android:layout_marginStart="@dimen/ksh_item_margin_start" android:background="@drawable/ksh_key_item_background" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:singleLine="true" android:gravity="center" android:textSize="@dimen/ksh_item_text_size" /> diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml index 45a4af92339c..18716ef00815 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml @@ -52,14 +52,14 @@ android:drawableStart="@drawable/ic_shortcutlist_search" android:drawablePadding="15dp" android:singleLine="true" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:inputType="text" android:textDirection="locale" android:textAlignment="viewStart" android:hint="@string/keyboard_shortcut_search_list_hint" android:textAppearance="@android:style/TextAppearance.Material" android:textSize="16sp" - android:textColorHint="?androidprv:attr/materialColorOutline" /> + android:textColorHint="@androidprv:color/materialColorOutline" /> <ImageButton android:id="@+id/keyboard_shortcuts_search_cancel" diff --git a/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml b/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml index 636f479e5778..e47fc62c6e16 100644 --- a/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml +++ b/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml @@ -32,7 +32,7 @@ android:layout_width="@dimen/keyguard_settings_popup_menu_icon_height" android:layout_height="@dimen/keyguard_settings_popup_menu_icon_width" android:layout_marginEnd="@dimen/keyguard_settings_popup_menu_icon_end_margin" - android:tint="?androidprv:attr/materialColorOnSecondaryFixed" + android:tint="@androidprv:color/materialColorOnSecondaryFixed" android:importantForAccessibility="no" tools:ignore="UseAppTint" /> @@ -41,7 +41,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="?androidprv:attr/materialColorOnSecondaryFixed" + android:textColor="@androidprv:color/materialColorOnSecondaryFixed" android:textSize="14sp" android:maxLines="1" android:ellipsize="end" /> diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml index 4d207da851cd..87433be45a7a 100644 --- a/packages/SystemUI/res/layout/long_screenshot.xml +++ b/packages/SystemUI/res/layout/long_screenshot.xml @@ -32,8 +32,8 @@ android:layout_marginStart="8dp" android:layout_marginTop="@dimen/long_screenshot_action_bar_top_margin" android:background="@drawable/overlay_button_background" - android:backgroundTint="?androidprv:attr/materialColorPrimary" - android:textColor="?androidprv:attr/materialColorOnPrimary" + android:backgroundTint="@androidprv:color/materialColorPrimary" + android:textColor="@androidprv:color/materialColorOnPrimary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/preview" /> @@ -47,8 +47,8 @@ android:layout_marginStart="6dp" android:layout_marginTop="@dimen/long_screenshot_action_bar_top_margin" android:background="@drawable/overlay_button_outline" - android:backgroundTint="?androidprv:attr/materialColorPrimary" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:backgroundTint="@androidprv:color/materialColorPrimary" + android:textColor="@androidprv:color/materialColorOnSurface" app:layout_constraintStart_toEndOf="@id/save" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/preview" @@ -57,7 +57,7 @@ <ImageButton android:id="@+id/share" style="@android:style/Widget.Material.Button.Borderless" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginEnd="8dp" @@ -114,10 +114,10 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:handleThickness="@dimen/screenshot_crop_handle_thickness" - app:handleColor="?androidprv:attr/materialColorSecondary" - app:scrimColor="?androidprv:attr/materialColorSurfaceContainer" + app:handleColor="@androidprv:color/materialColorSecondary" + app:scrimColor="@androidprv:color/materialColorSurfaceContainer" app:scrimAlpha="128" - app:containerBackgroundColor="?androidprv:attr/materialColorSurfaceContainer" + app:containerBackgroundColor="@androidprv:color/materialColorSurfaceContainer" tools:background="?android:colorBackground" tools:minHeight="100dp" tools:minWidth="100dp" /> @@ -131,11 +131,11 @@ app:layout_constraintTop_toTopOf="@id/preview" app:layout_constraintLeft_toLeftOf="parent" app:handleThickness="@dimen/screenshot_crop_handle_thickness" - app:handleColor="?androidprv:attr/materialColorSecondary" - app:scrimColor="?androidprv:attr/materialColorSurfaceContainer" + app:handleColor="@androidprv:color/materialColorSecondary" + app:scrimColor="@androidprv:color/materialColorSurfaceContainer" app:scrimAlpha="128" app:borderThickness="4dp" - app:borderColor="?androidprv:attr/materialColorSurfaceBright" /> + app:borderColor="@androidprv:color/materialColorSurfaceBright" /> <ImageButton android:id="@+id/edit" @@ -147,7 +147,7 @@ android:background="@drawable/screenshot_edit_background" android:src="@drawable/ic_screenshot_edit" android:contentDescription="@string/screenshot_edit_label" - android:tint="?androidprv:attr/materialColorOnSecondaryFixed" + android:tint="@androidprv:color/materialColorOnSecondaryFixed" android:padding="16dp" android:scaleType="fitCenter" app:layout_constraintBottom_toBottomOf="parent" diff --git a/packages/SystemUI/res/layout/notif_half_shelf.xml b/packages/SystemUI/res/layout/notif_half_shelf.xml index d8d298573d04..9a66ca9f3baa 100644 --- a/packages/SystemUI/res/layout/notif_half_shelf.xml +++ b/packages/SystemUI/res/layout/notif_half_shelf.xml @@ -66,7 +66,7 @@ android:gravity="center_vertical|start" android:ellipsize="end" android:maxLines="2" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:fontFamily="@*android:string/config_headlineFontFamilyMedium" android:textSize="16sp" /> diff --git a/packages/SystemUI/res/layout/notif_half_shelf_row.xml b/packages/SystemUI/res/layout/notif_half_shelf_row.xml index 9ef342ce5220..b2eaa6ce92b5 100644 --- a/packages/SystemUI/res/layout/notif_half_shelf_row.xml +++ b/packages/SystemUI/res/layout/notif_half_shelf_row.xml @@ -60,7 +60,7 @@ android:ellipsize="end" android:maxLines="1" android:fontFamily="@*android:string/config_headlineFontFamily" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:textSize="16sp" /> @@ -75,7 +75,7 @@ android:maxLines="1" android:layout_below="@id/channel_name" android:fontFamily="@*android:string/config_bodyFontFamily" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:textSize="14sp" /> </RelativeLayout> diff --git a/packages/SystemUI/res/layout/status_bar_notification_footer_redesign.xml b/packages/SystemUI/res/layout/notification_2025_footer.xml index 71c77a56b6a8..9b3d67f7b4a2 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_footer_redesign.xml +++ b/packages/SystemUI/res/layout/notification_2025_footer.xml @@ -64,6 +64,8 @@ android:contentDescription="@string/accessibility_clear_all" android:focusable="true" android:text="@string/clear_all_notifications_text" + android:ellipsize="end" + android:maxLines="1" app:layout_constraintEnd_toStartOf="@id/settings_button" app:layout_constraintStart_toEndOf="@id/history_button" /> diff --git a/packages/SystemUI/res/layout/notification_children_divider.xml b/packages/SystemUI/res/layout/notification_children_divider.xml index 13e24a9ea277..c1d94f990d25 100644 --- a/packages/SystemUI/res/layout/notification_children_divider.xml +++ b/packages/SystemUI/res/layout/notification_children_divider.xml @@ -21,4 +21,4 @@ android:id="@+id/notification_more_divider" android:layout_width="match_parent" android:layout_height="@dimen/notification_divider_height" - android:background="?androidprv:attr/materialColorOnSurfaceVariant" /> + android:background="@androidprv:color/materialColorOnSurfaceVariant" /> diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml index 3a752c81b95a..cb9d8115d674 100644 --- a/packages/SystemUI/res/layout/notification_conversation_info.xml +++ b/packages/SystemUI/res/layout/notification_conversation_info.xml @@ -174,7 +174,7 @@ android:contentDescription="@string/notification_more_settings" android:background="@drawable/ripple_drawable_20dp" android:src="@drawable/ic_settings" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" android:layout_alignParentEnd="true" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index 19a3f2fd521c..edca7e3a9940 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -103,7 +103,7 @@ asked for it --> android:contentDescription="@string/notification_app_settings" android:src="@drawable/ic_info" android:layout_toStartOf="@id/info" - android:tint="?androidprv:attr/materialColorPrimary"/> + android:tint="@androidprv:color/materialColorPrimary"/> <ImageButton android:id="@+id/info" android:layout_width="@dimen/notification_importance_toggle_size" @@ -112,7 +112,7 @@ asked for it --> android:contentDescription="@string/notification_more_settings" android:background="@drawable/ripple_drawable_20dp" android:src="@drawable/ic_settings" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" android:layout_alignParentEnd="true" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/notification_snooze.xml b/packages/SystemUI/res/layout/notification_snooze.xml index ce09385eaf45..f114f4cc02fa 100644 --- a/packages/SystemUI/res/layout/notification_snooze.xml +++ b/packages/SystemUI/res/layout/notification_snooze.xml @@ -23,7 +23,7 @@ android:orientation="vertical" android:paddingTop="2dp" android:paddingBottom="2dp" - android:background="?androidprv:attr/materialColorSurfaceContainerHigh" + android:background="@androidprv:color/materialColorSurfaceContainerHigh" android:theme="@style/Theme.SystemUI"> <RelativeLayout @@ -38,7 +38,7 @@ android:layout_alignParentStart="true" android:layout_centerVertical="true" android:paddingStart="@*android:dimen/notification_content_margin_end" - android:textColor="?androidprv:attr/materialColorOnSurface" + android:textColor="@androidprv:color/materialColorOnSurface" android:paddingEnd="4dp"/> <ImageView diff --git a/packages/SystemUI/res/layout/notification_snooze_option.xml b/packages/SystemUI/res/layout/notification_snooze_option.xml index fa6f965198d4..364b44c97d61 100644 --- a/packages/SystemUI/res/layout/notification_snooze_option.xml +++ b/packages/SystemUI/res/layout/notification_snooze_option.xml @@ -23,4 +23,4 @@ android:layout_marginEnd="@*android:dimen/notification_content_margin_end" android:gravity="center_vertical" android:textSize="14sp" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"/>
\ No newline at end of file + android:textColor="@androidprv:color/materialColorOnSurfaceVariant"/>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml b/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml index b84f3a9794be..3ca4b94d3003 100644 --- a/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml +++ b/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml @@ -25,7 +25,7 @@ android:foreground="?android:attr/selectableItemBackground" app:cardCornerRadius="28dp" app:cardElevation="0dp" - app:cardBackgroundColor="?androidprv:attr/materialColorSurfaceBright"> + app:cardBackgroundColor="@androidprv:color/materialColorSurfaceBright"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" diff --git a/packages/SystemUI/res/layout/privacy_dialog_v2.xml b/packages/SystemUI/res/layout/privacy_dialog_v2.xml index 76098a1ab486..0392322aa1c1 100644 --- a/packages/SystemUI/res/layout/privacy_dialog_v2.xml +++ b/packages/SystemUI/res/layout/privacy_dialog_v2.xml @@ -45,7 +45,7 @@ android:layout_height="wrap_content" android:text="@string/privacy_dialog_summary" android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" + android:textColor="@androidprv:color/materialColorOnSurfaceVariant" android:gravity="center" android:layout_marginBottom="20dp"/> </LinearLayout> diff --git a/packages/SystemUI/res/layout/record_issue_dialog.xml b/packages/SystemUI/res/layout/record_issue_dialog.xml index b2a8c4ce96db..76a7d3432380 100644 --- a/packages/SystemUI/res/layout/record_issue_dialog.xml +++ b/packages/SystemUI/res/layout/record_issue_dialog.xml @@ -55,7 +55,7 @@ android:layout_height="@dimen/screenrecord_option_icon_size" android:layout_weight="0" android:src="@drawable/ic_screenrecord" - app:tint="?androidprv:attr/materialColorOnSurface" + app:tint="@androidprv:color/materialColorOnSurface" android:importantForAccessibility="no" android:layout_gravity="center" android:layout_marginEnd="@dimen/screenrecord_option_padding" /> @@ -95,7 +95,7 @@ android:layout_height="@dimen/screenrecord_option_icon_size" android:layout_weight="0" android:src="@drawable/ic_bugreport" - app:tint="?androidprv:attr/materialColorOnSurface" + app:tint="@androidprv:color/materialColorOnSurface" android:importantForAccessibility="no" android:layout_gravity="center" android:layout_marginEnd="@dimen/screenrecord_option_padding" /> diff --git a/packages/SystemUI/res/layout/screen_share_dialog.xml b/packages/SystemUI/res/layout/screen_share_dialog.xml index 0533c7e3fc50..78d1ab25ffa9 100644 --- a/packages/SystemUI/res/layout/screen_share_dialog.xml +++ b/packages/SystemUI/res/layout/screen_share_dialog.xml @@ -36,7 +36,7 @@ android:layout_width="@dimen/screenrecord_logo_size" android:layout_height="@dimen/screenrecord_logo_size" android:src="@drawable/ic_media_projection_permission" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" android:importantForAccessibility="no"/> <TextView android:id="@+id/screen_share_dialog_title" diff --git a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml index 8c31713a5e34..1ef010b62d81 100644 --- a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml +++ b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml @@ -39,6 +39,6 @@ android:ellipsize="marquee" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="?androidprv:attr/materialColorError" /> + android:textColor="@androidprv:color/materialColorError" /> </LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/screenshot_shelf.xml b/packages/SystemUI/res/layout/screenshot_shelf.xml index fff1de7c1049..f03c0323a7b7 100644 --- a/packages/SystemUI/res/layout/screenshot_shelf.xml +++ b/packages/SystemUI/res/layout/screenshot_shelf.xml @@ -127,8 +127,8 @@ android:layout_height="match_parent" android:layout_margin="@dimen/overlay_dismiss_button_margin" android:background="@drawable/circular_background" - android:backgroundTint="?androidprv:attr/materialColorPrimary" - android:tint="?androidprv:attr/materialColorOnPrimary" + android:backgroundTint="@androidprv:color/materialColorPrimary" + android:tint="@androidprv:color/materialColorOnPrimary" android:padding="4dp" android:src="@drawable/ic_close"/> </FrameLayout> diff --git a/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml b/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml index 39ec09b14157..980387176cff 100644 --- a/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml +++ b/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml @@ -38,8 +38,8 @@ android:layout_height="24dp" android:layout_gravity="center" android:background="@drawable/circular_background" - android:backgroundTint="?androidprv:attr/materialColorSurfaceContainerHigh" - android:tint="?androidprv:attr/materialColorOnSurface" + android:backgroundTint="@androidprv:color/materialColorSurfaceContainerHigh" + android:tint="@androidprv:color/materialColorOnSurface" android:padding="2dp" android:src="@drawable/ic_close"/> </FrameLayout> diff --git a/packages/SystemUI/res/layout/shelf_action_chip.xml b/packages/SystemUI/res/layout/shelf_action_chip.xml index 1c65e366d619..430e9f742a07 100644 --- a/packages/SystemUI/res/layout/shelf_action_chip.xml +++ b/packages/SystemUI/res/layout/shelf_action_chip.xml @@ -27,7 +27,7 @@ > <ImageView android:id="@+id/overlay_action_chip_icon" - android:tint="?androidprv:attr/materialColorOnSecondary" + android:tint="@androidprv:color/materialColorOnSecondary" android:tintMode="src_in" android:layout_width="@dimen/overlay_action_chip_icon_size" android:layout_height="@dimen/overlay_action_chip_icon_size"/> @@ -37,5 +37,5 @@ android:layout_height="wrap_content" android:fontFamily="@*android:string/config_headlineFontFamilyMedium" android:textSize="@dimen/overlay_action_chip_text_size" - android:textColor="?androidprv:attr/materialColorOnSecondary"/> + android:textColor="@androidprv:color/materialColorOnSecondary"/> </LinearLayout> diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index b8544a64d9da..a3bad8f012ac 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -58,7 +58,7 @@ android:contentDescription="@string/accessibility_volume_settings" android:soundEffectsEnabled="false" android:src="@drawable/horizontal_ellipsis" - android:tint="?androidprv:attr/materialColorPrimary" + android:tint="@androidprv:color/materialColorPrimary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@id/volume_dialog_main_slider_container" app:layout_constraintStart_toStartOf="@id/volume_dialog_main_slider_container" @@ -79,4 +79,4 @@ app:layout_constraintEnd_toStartOf="@id/volume_dialog_background" app:layout_constraintTop_toTopOf="@id/volume_dialog_main_slider_container" /> -</androidx.constraintlayout.motion.widget.MotionLayout>
\ No newline at end of file +</androidx.constraintlayout.motion.widget.MotionLayout> diff --git a/packages/SystemUI/res/layout/volume_ringer_button.xml b/packages/SystemUI/res/layout/volume_ringer_button.xml index 38bb783c2920..e65d0b938b65 100644 --- a/packages/SystemUI/res/layout/volume_ringer_button.xml +++ b/packages/SystemUI/res/layout/volume_ringer_button.xml @@ -26,7 +26,7 @@ android:layout_marginBottom="@dimen/volume_dialog_components_spacing" android:contentDescription="@string/volume_ringer_mode" android:gravity="center" - android:tint="?androidprv:attr/materialColorOnSurface" + android:tint="@androidprv:color/materialColorOnSurface" android:src="@drawable/volume_ringer_item_bg" android:background="@drawable/volume_ringer_item_bg"/> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index cef0316c23d3..1d0524a7192e 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Om ’n app met ’n legstuk oop te maak, sal jy moet verifieer dat dit jy is. Hou ook in gedagte dat enigeen dit kan bekyk, selfs wanneer jou tablet gesluit is. Sommige legstukke is moontlik nie vir jou sluitskerm bedoel nie en dit kan onveilig wees om dit hier by te voeg."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Het dit"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Legstukke"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Maak seker dat “Wys legstukke op sluitskerm” in instellings geaktiveer is om die “Legstukke”-kortpad by te voeg."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Instellings"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Wissel gebruiker"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aftrekkieslys"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Kennisgewings"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekke"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vee alle stil kennisgewings uit"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Maak kennisgewinginstellings oop"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kennisgewings onderbreek deur Moenie Steur Nie"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Geen kennisgewings nie}=1{Kennisgewings is deur {mode} onderbreek}=2{Kennisgewings is deur {mode} en een ander modus onderbreek}other{Kennisgewings is deur {mode} en # ander modusse onderbreek}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Begin nou"</string> @@ -664,21 +663,21 @@ <string name="csd_500_system_lowered_text" product="default" msgid="7414943302186884124">"Oorfoonvolume het die veilige limiet vir hierdie week oorskry"</string> <string name="csd_button_keep_listening" product="default" msgid="4093794049149286784">"Hou aan luister"</string> <string name="csd_button_lower_volume" product="default" msgid="5347210412376264579">"Stel volume sagter"</string> - <string name="screen_pinning_title" msgid="9058007390337841305">"Program is vasgespeld"</string> + <string name="screen_pinning_title" msgid="9058007390337841305">"App is vasgespeld"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig om dit te ontspeld."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Tuis om dit te ontspeld."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Dit hou dit in sig totdat jy dit ontspeld. Swiep op en hou om te ontspeld."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Oorsig om dit te ontspeld."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Tuis om dit te ontspeld."</string> <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Persoonlike data (soos kontakte en e-posinhoud) kan toeganklik wees."</string> - <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Vasgespelde program kan ander programme oopmaak."</string> - <string name="screen_pinning_toast" msgid="8177286912533744328">"Raak en hou die terug- en oorsigknoppie om hierdie program te ontspeld"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Raak en hou die terug- en tuisknoppie om hierdie program te ontspeld"</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Swiep op en hou om hierdie program te ontspeld"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Vasgespelde app kan ander apps oopmaak."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Raak en hou die terug- en oorsigknoppie om hierdie app te ontspeld"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Raak en hou die terug- en tuisknoppie om hierdie app te ontspeld"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Swiep op en hou om hierdie app te ontspeld"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Het dit"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Nee, dankie"</string> - <string name="screen_pinning_start" msgid="7483998671383371313">"Program is vasgespeld"</string> - <string name="screen_pinning_exit" msgid="4553787518387346893">"Program is ontspeld"</string> + <string name="screen_pinning_start" msgid="7483998671383371313">"App is vasgespeld"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"App is ontspeld"</string> <string name="stream_voice_call" msgid="7468348170702375660">"Bel"</string> <string name="stream_system" msgid="7663148785370565134">"Stelsel"</string> <string name="stream_ring" msgid="7550670036738697526">"Lui"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Kopnasporing"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tik om luiermodus te verander"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"luiermodus"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>; tik om luiermodus te verander"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"demp"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ontdemp"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibreer"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Sluit skerm"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Maak ’n nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Verrigting van veelvuldige take"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Gebruik verdeelde skerm met huidige app aan die regterkant"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Gebruik verdeelde skerm met huidige app aan die linkerkant"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skakel oor van verdeelde skerm na volskerm"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skakel oor na app regs of onder terwyl jy verdeelde skerm gebruik"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skakel oor na app links of bo terwyl jy verdeelde skerm gebruik"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"</string> @@ -1117,7 +1118,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"wissel"</string> <string name="accessibility_floating_button_action_edit" msgid="1688227814600463987">"Wysig"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Toestelkontroles"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"Kies program om kontroles by te voeg"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"Kies app om kontroles by te voeg"</string> <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontrole bygevoeg.}other{# kontroles bygevoeg.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Verwyder"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Voeg <xliff:g id="APPNAME">%s</xliff:g> by?"</string> @@ -1138,7 +1139,7 @@ <string name="controls_favorite_rearrange_button" msgid="2942788904364641185">"Herrangskik"</string> <string name="controls_favorite_add_controls" msgid="1221420435546694004">"Voeg kontroles by"</string> <string name="controls_favorite_back_to_editing" msgid="184125114090062713">"Terug na wysiging"</string> - <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontroles kon nie gelaai word nie. Gaan die <xliff:g id="APP">%s</xliff:g>-program na om seker te maak dat die programinstellings nie verander het nie."</string> + <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontroles kon nie gelaai word nie. Gaan die <xliff:g id="APP">%s</xliff:g>-app na om seker te maak dat die appinstellings nie verander het nie."</string> <string name="controls_favorite_load_none" msgid="7687593026725357775">"Versoenbare kontroles is nie beskikbaar nie"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Ander"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Voeg by toestelkontroles"</string> @@ -1189,10 +1190,10 @@ <string name="media_ttt_default_device_type" msgid="4457646436153370169">"tablet"</string> <string name="media_transfer_receiver_content_description_unknown_app" msgid="7381771464846263667">"Saai jou media uit"</string> <string name="media_transfer_receiver_content_description_with_app_name" msgid="8555975056850659389">"Saai tans <xliff:g id="APP_LABEL">%1$s</xliff:g> uit"</string> - <string name="controls_error_timeout" msgid="794197289772728958">"Onaktief, gaan program na"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"Onaktief, gaan app na"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nie gekry nie"</string> <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrole is nie beskikbaar nie"</string> - <string name="controls_error_removed_message" msgid="2885911717034750542">"Kon nie by <xliff:g id="DEVICE">%1$s</xliff:g> ingaan nie. Gaan die <xliff:g id="APPLICATION">%2$s</xliff:g>-program na om seker te maak dat die kontrole steeds beskikbaar is en dat die programinstellings nie verander het nie."</string> + <string name="controls_error_removed_message" msgid="2885911717034750542">"Kon nie by <xliff:g id="DEVICE">%1$s</xliff:g> ingaan nie. Gaan die <xliff:g id="APPLICATION">%2$s</xliff:g>-app na om seker te maak dat die kontrole steeds beskikbaar is en dat die appinstellings nie verander het nie."</string> <string name="controls_open_app" msgid="483650971094300141">"Maak app oop"</string> <string name="controls_error_generic" msgid="352500456918362905">"Kan nie status laai nie"</string> <string name="controls_error_failed" msgid="960228639198558525">"Fout, probeer weer"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Kortpadsleutels"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Pasmaak kortpadsleutels"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Verwyder kortpad?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Stel terug na verstek?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Druk sleutel om kortpad toe te wys"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Dit sal jou gepasmaakte kortpad permanent uitvee."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Dit sal al jou gepasmaakte kortpaaie permanent uitvee."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Soekkortpaaie"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Geen soekresultate nie"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Vou ikoon in"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikoon vir Handeling- of Meta-sleutel"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plusikoon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Pasmaak"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Stel terug"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Klaar"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vou ikoon uit"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Sleutelbordinstellings"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Stel kortpad"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Verwyder"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, stel terug"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Kanselleer"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Druk sleutel"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Sleutelkombinasie is reeds in gebruik. Probeer ’n ander sleutel."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Druk die handelingsleutel op jou sleutelbord"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Welgedaan!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Jy het die Bekyk Onlangse Apps-gebaar voltooi"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutoriaalanimasie; klik om te onderbreek of hervat om te speel."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Sleutelbordlig"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Vlak %1$d van %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Huiskontroles"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 5f7774394862..687bd089d572 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ምግብሮች"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"የ«ምግብሮች» አቋራጭን ለማከል በቅንብሮች ውስጥ «ምግብሮችን በማያ ገፅ ቁልፍ ላይ አሳይ» የሚለው መንቃቱን ያረጋግጡ።"</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ቅንብሮች"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ተጠቃሚ ቀይር"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ወደታች ተጎታች ምናሌ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"በዚህ ክፍለ-ጊዜ ውስጥ ያሉ ሁሉም መተግበሪያዎች እና ውሂብ ይሰረዛሉ።"</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"ማሳወቂያዎች"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ውይይቶች"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ሁሉንም ጸጥ ያሉ ማሳወቂያዎችን ያጽዱ"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"የማሳወቂያ ቅንብሮችን ክፈት"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ምንም ማሳወቂያዎች የሉም}=1{ማሳወቂያዎች በ{mode} ባሉበት ቆመዋል}=2{ማሳወቂያዎች በ{mode} እና አንድ ሌላ ሁነታ ባሉበት ቆመዋል}one{ማሳወቂያዎች በ{mode} እና # ሌላ ሁነታ ባሉበት ቆመዋል}other{ማሳወቂያዎች በ{mode} እና # ሌላ ሁነታዎች ባሉበት ቆመዋል}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"አሁን ጀምር"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"የጭንቅላት ክትትል"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"የደዋይ ሁነታን ለመቀየር መታ ያድርጉ"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ደዋይ ሁነታ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>፣ የደዋይ ሁነታን ለመቀየር መታ ያድርጉ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ድምጸ-ከል አድርግ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ድምጸ-ከልን አንሳ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ንዘር"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ማያ ገፅ ቁልፍ"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"ማስታወሻ ይውሰዱ"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ብዙ ተግባራትን በተመሳሳይ ጊዜ ማከናወን"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"የአሁኑ መተግበሪያ በስተቀኝ ላይ ሆኖ የተከፈለ ማያ ገጽን ይጠቀሙ"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"የአሁኑ መተግበሪያ በስተግራ ላይ ሆኖ የተከፈለ ማያ ገጽን ይጠቀሙ"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"ከየተከፈለ ማያ ገጽ ወደ ሙሉ ገጽ ዕይታ ቀይር"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከታች ወዳለ መተግበሪያ ይቀይሩ"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከላይ ወዳለ መተግበሪያ ይቀይሩ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"በተከፈለ ማያ ገጽ ወቅት፡- መተግበሪያን ከአንዱ ወደ ሌላው ተካ"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"የእርምጃ ወይም ሜታ ቁልፍ አዶ"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"የመደመር አዶ"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"አብጅ"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"ዳግም አስጀምር"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"ተከናውኗል"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"መዘርጊያ አዶ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ወይም"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"በቁልፍ ሰሌዳዎ ላይ ያለውን የተግባር ቁልፍ ይጫኑ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ጥሩ ሠርተዋል!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"የሁሉንም መተግበሪያዎች አሳይ ምልክትን አጠናቅቀዋል"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"የአጋዥ ሥልጠና እነማ፣ ማጫወትን ባለበት ለማቆም እና ከቆመበት ለመቀጠል ጠቅ ያድርጉ።"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"የቁልፍ ሰሌዳ የጀርባ ብርሃን"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"ደረጃ %1$d ከ %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"የቤት ውስጥ ቁጥጥሮች"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index dd6e8500e2a9..0fc6598d404d 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"التطبيقات المصغَّرة"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"لإضافة اختصار \"التطبيقات المصغّرة\"، يجب تفعيل خيار \"عرض التطبيقات المصغّرة على شاشة القفل\" من خلال الإعدادات."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"الإعدادات"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"زر \"إظهار شاشة الاستراحة\""</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"تبديل المستخدم"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"القائمة المنسدلة"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"سيتم حذف كل التطبيقات والبيانات في هذه الجلسة."</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"تتبُّع حركة الرأس"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"انقر لتغيير وضع الرنين."</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"وضع الرنين"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"الحالة: <xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. انقر لتغيير وضع الرنين"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"كتم الصوت"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"إعادة الصوت"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"اهتزاز"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"شاشة القفل"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"تدوين ملاحظة"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"تعدُّد المهام"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"استخدام \"وضع تقسيم الشاشة\" مع تثبيت التطبيق الحالي على اليمين"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"استخدام \"وضع تقسيم الشاشة\" مع تثبيت التطبيق الحالي على اليسار"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"التبديل من وضع \"تقسيم الشاشة\" إلى وضع \"ملء الشاشة\""</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"التبديل إلى التطبيق على اليسار أو الأسفل أثناء استخدام \"تقسيم الشاشة\""</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"التبديل إلى التطبيق على اليمين أو الأعلى أثناء استخدام \"تقسيم الشاشة\""</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"استبدال تطبيق بآخر في وضع \"تقسيم الشاشة\""</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"رمز مفتاح الإجراء (مفتاح Meta)"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"رمز علامة الجمع (+)"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"تخصيص"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"إعادة الضبط"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"تم"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"رمز التوسيع"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"أو"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"اضغط على مفتاح الإجراء في لوحة المفاتيح"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"أحسنت!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"لقد أكملْت التدريب على إيماءة عرض جميع التطبيقات"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"صورة متحركة للدليل التوجيهي: يمكنك النقر عليها لإيقاف تشغيلها مؤقتًا واستئنافه."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"الإضاءة الخلفية للوحة المفاتيح"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"مستوى الإضاءة: %1$d من %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"إدارة المنزل آليًّا"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 86e13055960b..b0a9d0960087 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ৱিজেট"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"ৱিজেট\"ৰ শ্বৰ্টকাট যোগ দিবলৈ, ছেটিঙত \"লক স্ক্ৰীনত ৱিজেট দেখুৱাওক\" সক্ষম কৰি থোৱাটো নিশ্চিত কৰক।"</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ছেটিং"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"স্ক্ৰীনছেভাৰৰ বুটাম দেখুৱাওক"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যৱহাৰকাৰী সলনি কৰক"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"পুল-ডাউনৰ মেনু"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"এই ছেশ্বনৰ আটাইবোৰ এপ্ আৰু ডেটা মচা হ\'ব।"</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"জাননীসমূহ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"বাৰ্তালাপ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"আটাইবোৰ নীৰৱ জাননী মচক"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"জাননীৰ ছেটিং খোলক"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"অসুবিধা নিদিব-ই জাননী পজ কৰিছে"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{কোনো জাননী নাই}=1{{mode}এ জাননী পজ কৰিছে}=2{{mode} আৰু আন এটা ম’ডে জাননী পজ কৰিছে}one{{mode} আৰু আন # টা ম’ডে জাননী পজ কৰিছে}other{{mode} আৰু আন # টা ম’ডে জাননী পজ কৰিছে}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"এতিয়াই আৰম্ভ কৰক"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"হে’ড ট্ৰেকিং"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ৰিংগাৰ ম’ড সলনি কৰিবলৈ টিপক"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ৰিংগাৰ ম’ড"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ৰিংগাৰ ম’ড সলনি কৰিবলৈ টিপক"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"মিউট কৰক"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"আনমিউট কৰক"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"কম্পন কৰক"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্ৰীন"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"টোকা লিখক"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"মাল্টিটাস্কিং"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"বৰ্তমানৰ এপ্টোৰ সৈতে সোঁফালে বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰক"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"বৰ্তমানৰ এপ্টোৰ সৈতে বাওঁফালে বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰক"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"বিভাজিত স্ক্ৰীনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত সোঁফালে অথবা তলত থকা এপলৈ সলনি কৰক"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত বাওঁফালে অথবা ওপৰত থকা এপলৈ সলনি কৰক"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"কাৰ্য বা মেটা কীৰ চিহ্ন"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"যোগ চিনৰ চিহ্ন"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"কাষ্টমাইজ কৰক"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"ৰিছেট কৰক"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"হ’ল"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"বিস্তাৰ কৰাৰ চিহ্ন"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"আপোনাৰ কীব’ৰ্ডৰ কাৰ্য কীটোত টিপক"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"বঢ়িয়া!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"আপুনি আটাইবোৰ এপ্ চোৱাৰ নিৰ্দেশনাটো সম্পূৰ্ণ কৰিছে"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"টিউট’ৰিয়েল এনিমেশ্বন, পজ কৰিবলৈ আৰু প্লে’ কৰাটো পুনৰ আৰম্ভ কৰিবলৈ ক্লিক কৰক।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীব’ৰ্ডৰ বেকলাইট"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dৰ %1$d স্তৰ"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ঘৰৰ সা-সৰঞ্জামৰ নিয়ন্ত্ৰণ"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 3082284353d3..0f59bfbc86df 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Vidcetdən istifadə edərək tətbiqi açmaq üçün kimliyi doğrulamalısınız. Planşet kilidli olsa da, hər kəs vidcetlərə baxa bilər. Bəzi vidcetlər kilid ekranı üçün nəzərdə tutulmayıb və bura əlavə etmək təhlükəli ola bilər."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Anladım"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Vidcetlər"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"Vidcetlər\" qısayolunu əlavə etmək üçün ayarlarda \"Vidcetləri kilidli ekranda göstərin\" seçimi aktiv olmalıdır."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Ayarlar"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aşağı çəkilən menyu"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Bildirişlər"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Söhbətlər"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Səssiz bildirişlərin hamısını silin"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Bildiriş ayarlarını açın"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Bildiriş yoxdur}=1{Bildirişlər {mode} tərəfindən dayandırıldı}=2{Bildirişlər {mode} və digər rejim tərəfindən dayandırıldı}other{Bildirişlər {mode} və # digər rejim tərəfindən dayandırıldı}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"İndi başlayın"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Baş izləməsi"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Zəng rejimini dəyişmək üçün toxunun"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"zəng səsi rejimi"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, zəng səsi rejimini dəyişmək üçün toxunun"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"susdurun"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"səssiz rejimdən çıxarın"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrasiya"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Kilid ekranı"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Qeyd götürün"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Çoxsaylı tapşırıq icrası"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Cari tətbiq sağda olmaqla bölünmüş ekrandan istifadə edin"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Cari tətbiq solda olmaqla bölünmüş ekrandan istifadə edin"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana keçin"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bölünmüş ekran istifadə edərkən sağda və ya aşağıda tətbiqə keçin"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bölünmüş ekran istifadə edərkən solda və ya yuxarıda tətbiqə keçin"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişin"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Klaviatura qısayolları"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Klaviatura qısayollarını fərdiləşdirin"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Qısayol silinsin?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Defolt vəziyyətə qaytarılsın?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Qısayol təyin etmək üçün düyməni basın"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Bu, fərdi qısayolunuzu həmişəlik siləcək."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Bu, bütün fərdi qısayollarınızı həmişəlik siləcək."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Axtarış qısayolları"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Axtarış nəticəsi yoxdur"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"İkonanı yığcamlaşdırın"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Əməliyyat və ya Meta düyməsi ikonası"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Üstəgəl ikonası"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Fərdiləşdirin"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Sıfırlayın"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Hazırdır"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"İkonanı genişləndirin"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"və ya"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Klaviatura ayarları"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Qısayol ayarlayın"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Silin"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Bəli, sıfırlayın"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Ləğv edin"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Düyməni basın"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Düymə kombinasiyası artıq istifadə olunur. Başqa düyməni sınayın."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Klaviaturada fəaliyyət açarına basın"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Əla!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"\"Bütün tətbiqlərə baxın\" jestini tamamladınız"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Öyrədici animasiya, oxudulmanı durdurmaq və davam etdirmək üçün klikləyin."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatura işığı"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Səviyyə %1$d/%2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Ev nizamlayıcıları"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 09aef06b942a..a339b114f798 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Vidžeti"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Da biste dodali prečicu Vidžeti, uverite se da je u podešavanjima omogućeno Prikazuj vidžete na zaključanom ekranu."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Podešavanja"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Dugme Prikaži čuvar ekrana"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zameni korisnika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući meni"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Sve aplikacije i podaci u ovoj sesiji će biti izbrisani."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Obaveštenja"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzacije"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obrišite sva nečujna obaveštenja"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Otvorite podešavanja obaveštenja"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obaveštenja su pauzirana režimom Ne uznemiravaj"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nema obaveštenja}=1{Obaveštenja je pauzirao {mode}}=2{Obaveštenja su pauzirali {mode} i još jedan režim}one{Obaveštenja su pauzirali {mode} i još # režim}few{Obaveštenja su pauzirali {mode} i još # režima}other{Obaveštenja su pauzirali {mode} i još # režima}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Započni"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Praćenje glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dodirnite da biste promenili režim zvona"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"režim zvona"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, dodirnite da biste promenili režim zvona"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"isključite zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"uključite zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibracija"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Otključavanje ekrana"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Napravi belešku"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Obavljanje više zadataka istovremeno"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Koristi podeljeni ekran sa tom aplikacijom s desne strane"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Koristi podeljeni ekran sa tom aplikacijom s leve strane"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pređi sa podeljenog ekrana na ceo ekran"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pređi u aplikaciju zdesna ili ispod dok je podeljen ekran"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pređite u aplikaciju sleva ili iznad dok koristite podeljeni ekran"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"U režimu podeljenog ekrana: zamena jedne aplikacije drugom"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikona tastera za radnju ili meta tastera"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikona znaka plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Prilagodi"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Resetuj"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Gotovo"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite taster radnji na tastaturi"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Odlično!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Dovršili ste pokret za prikazivanje svih aplikacija."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija vodiča, kliknite da biste pauzirali i nastavili reprodukciju."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvetljenje tastature"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrole za dom"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 51cc35a070ce..9c5a4f287137 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Віджэты"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Каб дадаць спалучэнне клавіш \"Віджэты\", у наладах павінна быць уключана функцыя \"Паказваць віджэты на экране блакіроўкі\"."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Налады"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Перайсці да іншага карыстальніка"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"высоўнае меню"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Усе праграмы і даныя гэтага сеанса будуць выдалены."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Апавяшчэнні"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Размовы"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Выдаліць усе апавяшчэнні без гуку"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Адкрыць налады апавяшчэнняў"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\""</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Апавяшчэнняў няма}=1{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\"}=2{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ адным рэжымам}one{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжымам}few{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжымамі}many{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжымамі}other{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжыму}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Пачаць зараз"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Адсочваць рух галавы"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Націсніце, каб змяніць рэжым званка"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"рэжым званка"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>: націсніце, каб змяніць рэжым званка"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"выключыць гук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"уключыць гук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вібрыраваць"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Экран блакіроўкі"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Стварыць нататку"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Шматзадачнасць"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Падзяліць экран і памясціць гэту праграму справа"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Падзяліць экран і памясціць гэту праграму злева"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пераключыцца з рэжыму падзеленага экрана на поўнаэкранны рэжым"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Пераключыцца на праграму справа або ўнізе на падзеленым экране"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Пераключыцца на праграму злева або ўверсе на падзеленым экране"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"У рэжыме падзеленага экрана замяніць адну праграму на іншую"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Значок клавішы дзеяння (мета-клавішы)"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Значок плюса"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Наладзіць"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Скінуць"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Гатова"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Разгарнуць\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Націсніце клавішу дзеяння на клавіятуры"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Выдатна!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Вы навучыліся рабіць жэст для прагляду ўсіх праграм"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анімацыя ў дапаможніку: націсніце, каб прыпыніць ці ўзнавіць прайграванне."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Падсветка клавіятуры"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Узровень %1$d з %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Кіраванне домам"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 12e25cca0c1b..ac2edfe1fc61 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"За да отворите дадено приложение посредством приспособление, ще трябва да потвърдите, че това сте вие. Също така имайте предвид, че всеки ще вижда приспособленията дори когато таблетът ви е заключен. Възможно е някои от тях да не са предназначени за заключения екран и добавянето им на него може да е опасно."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Разбрах"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Приспособления"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"За да добавите пряк път към „Приспособления“, уверете се, че опцията „Показване на приспособленията на заключения екран“ е активирана в настройките."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Настройки"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Бутон за показване на скрийнсейвъра"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Превключване между потребителите"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"падащо меню"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Всички приложения и данни в тази сесия ще бъдат изтрити."</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Известия"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Изчистване на всички беззвучни известия"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Отваряне на настройките за известията"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известията са поставени на пауза от режима „Не безпокойте“"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Няма известия}=1{Известията са поставени на пауза от {mode}}=2{Известията са поставени на пауза от {mode} и един друг режим}other{Известията са поставени на пауза от {mode} и # други режима}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Стартиране сега"</string> @@ -874,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Заключване на екрана"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Създаване на бележка"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Няколко задачи едновременно"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Използване на разделен екран с текущото приложение вдясно"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Използване на разделен екран с текущото приложение вляво"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Превключване от разделен към цял екран"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Превключване към приложението вдясно/отдолу в режима на разделен екран"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Превключване към приложението вляво/отгоре в режима на разделен екран"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"При разделен екран: замяна на дадено приложение с друго"</string> @@ -1429,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Клавишни комбинации"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Персонализиране на клавишните комбинации"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Да се премахне ли клавишната комбинация?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Да се възстановят ли стандартните настройки?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Натиснете клавиш, за да зададете клавишна комбинация"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Това ще изтрие персонализираната клавишна комбинация за постоянно."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Това ще изтрие всичките ви персонализирани преки пътища за постоянно."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Търсете клавишни комбинации"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Няма резултати от търсенето"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за свиване"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Икона на клавиша за действия или клавиша Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Икона на плюс"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Персонализиране"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Нулиране"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Готово"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за разгъване"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> @@ -1452,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Настройки на клавиатурата"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Задаване на клавишна комбинация"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Премахване"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Да, нулиране"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Отказ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Натиснете клавиш"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Клавишната комбинация вече се използва. Опитайте с друг клавиш."</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 8af32a83a35f..c35c62aec312 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"উইজেট ব্যবহার করে কোনও অ্যাপ খুলতে, আপনাকে নিজের পরিচয় যাচাই করতে হবে। এছাড়াও, মনে রাখবেন, আপনার ট্যাবলেট লক থাকলেও যেকেউ তা দেখতে পারবেন। কিছু উইজেট আপনার লক স্ক্রিনের উদ্দেশ্যে তৈরি করা হয়নি এবং এখানে যোগ করা নিরাপদ নাও হতে পারে।"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"বুঝেছি"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"উইজেট"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"উইজেট\" শর্টকার্ট যোগ করতে, সেটিংস থেকে \"লক স্ক্রিনে উইজেট দেখুন\" বিকল্প চালু আছে কিনা তা নিশ্চিত করুন।"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"সেটিংস"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যবহারকারী পাল্টে দিন"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"পুলডাউন মেনু"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"বিজ্ঞপ্তি"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"কথোপকথন"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"সব নীরব বিজ্ঞপ্তি মুছুন"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"বিজ্ঞপ্তির সেটিংস খুলুন"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'বিরক্ত করবে না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{কোনও বিজ্ঞপ্তি নেই}=1{{mode}-এর জন্য বিজ্ঞপ্তি পজ করা হয়েছে}=2{{mode} ও অন্য আরেকটি মোডের জন্য বিজ্ঞপ্তি পজ করা হয়েছে}one{{mode} ও অন্য #টি মোডের জন্য বিজ্ঞপ্তি পজ করা হয়েছে}other{{mode} ও অন্য #টি মোডের জন্য বিজ্ঞপ্তি পজ করা হয়েছে}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"এখন শুরু করুন"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"হেড ট্র্যাকিং"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"রিঙ্গার মোড পরিবর্তন করতে ট্যাপ করুন"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"রিঙ্গার মোড"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, রিঙ্গার মোড পরিবর্তন করতে ট্যাপ করুন"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"মিউট করুন"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"আনমিউট করুন"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ভাইব্রেট করান"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্রিন"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"একটি নোট লিখুন"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"মাল্টিটাস্কিং"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ডানদিকে বর্তমান অ্যাপে স্প্লিট স্ক্রিন ব্যবহার করুন"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"বাঁদিকে বর্তমান অ্যাপে স্প্লিট স্ক্রিন ব্যবহার করুন"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"\'স্প্লিট স্ক্রিন\' থেকে ফুল স্ক্রিনে পাল্টান"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"স্প্লিট স্ক্রিন ব্যবহার করার সময় ডানদিকের বা নিচের অ্যাপে পাল্টে নিন"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"স্প্লিট স্ক্রিন ব্যবহার করার সময় বাঁদিকের বা উপরের অ্যাপে পাল্টে নিন"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"\'স্প্লিট স্ক্রিন\' থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পাল্টান"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"কীবোর্ড শর্টকাট"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"কীবোর্ড শর্টকাট কাস্টমাইজ করুন"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"শর্টকাট সরাবেন?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ডিফল্ট শর্টকার্ট আবার রিসেট করতে চান?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"শর্টকাট অ্যাসাইন করতে কী প্রেস করুন"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"এটি আপনার কাস্টম শর্টকাট স্থায়ীভাবে মুছে ফেলবে।"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"এটি আপনার সব কাস্টম শর্টকার্ট স্থায়ীভাবে মুছে দেবে।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"শর্টকাট সার্চ করুন"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"কোনও সার্চ ফলাফল নেই"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"আইকন আড়াল করুন"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"অ্যাকশন বা মেটা কী আইকন"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"প্লাস আইকন"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"কাস্টমাইজ করুন"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"রিসেট করুন"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"হয়ে গেছে"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"আইকন বড় করুন"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"কীবোর্ড সেটিংস"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"শর্টকাট সেট করুন"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"সরান"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"হ্যাঁ, রিসেট করতে চাই"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"বাতিল করুন"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"কী প্রেস করুন"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"কী কম্বিনেশন আগে থেকে ব্যবহার হচ্ছে। অন্য কী ব্যবহার করে দেখুন।"</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"আপনার কীবোর্ডে অ্যাকশন কী প্রেস করুন"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"দারুণ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"আপনি \'সব অ্যাপের জেসচার দেখুন\' টিউটোরিয়াল সম্পূর্ণ করেছেন"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"টিউটোরিয়াল অ্যানিমেশন পজ করুন এবং আবার চালু করতে ক্লিক করুন।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীবোর্ড ব্যাকলাইট"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-এর মধ্যে %1$d লেভেল"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"হোম কন্ট্রোল"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index fe38ba846a18..f842aabe4514 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -529,8 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Da otvorite aplikaciju pomoću vidžeta, morat ćete potvrditi identitet. Također imajte na umu da ih svako može pregledati, čak i ako je tablet zaključan. Neki vidžeti možda nisu namijenjeni za vaš zaključani ekran i njihovo dodavanje ovdje možda nije sigurno."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Razumijem"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Vidžeti"</string> - <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Da biste dodali prečac Widgeti, provjerite je li u postavkama omogućena opcija Prikaži widgete na zaključanom zaslonu."</string> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Da dodate prečicu \"Vidžeti\", provjerite je li u postavkama omogućeno \"Prikazuj vidžete na zaključanom ekranu\"."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Postavke"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Prikaži gumb čuvara zaslona"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zamijeni korisnika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući meni"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Sve aplikacije i podaci iz ove sesije će se izbrisati."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Obavještenja"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obriši sva nečujna obavještenja"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Otvaranje postavki obavještenja"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obavještenja su pauzirana načinom rada Ne ometaj"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nema obavještenja}=1{Obavještenja su pauzirana putem načina rada {mode}}=2{Obavještenja su pauzirana putem načina rada {mode} i još jednog načina rada}one{Obavještenja su pauzirana putem načina rada {mode} i još # načina rada}few{Obavještenja su pauzirana putem načina rada {mode} i još # načina rada}other{Obavještenja su pauzirana putem načina rada {mode} i još # načina rada}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Započni odmah"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Praćenje položaja glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dodirnite da promijenite način rada zvuka zvona"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"način rada za zvuk zvona"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>; promjena načina rada zvuka zvona dodirom"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"isključite zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"uključite zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje ekrana"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Pisanje bilješke"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Korištenje podijeljenog ekrana s trenutnom aplikacijom na desnoj strani"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Korištenje podijeljenog ekrana s trenutnom aplikacijom na lijevoj strani"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prebacivanje s podijeljenog ekrana na prikaz preko cijelog ekrana"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Prelazak u aplikaciju desno ili ispod uz podijeljeni ekran"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pređite u aplikaciju lijevo ili iznad dok koristite podijeljeni ekran"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"</string> @@ -1428,18 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Prečice tastature"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Prilagodite prečice na tastaturi"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Ukloniti prečicu?"</string> - <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Želite li vratiti na zadano?"</string> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vratiti na zadano?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pritisnite tipku da dodijelite prečicu"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ovo će trajno izbrisati prilagođenu prečicu."</string> - <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Time će se trajno izbrisati svi vaši prilagođeni prečaci."</string> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Ovo će trajno izbrisati sve vaše prilagođene prečice."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Prečica pretraživanja"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Nema rezultata pretraživanja"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sužavanja"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikona tipke radnji ili meta tipka"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikona znaka plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Prilagođavanje"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Poništavanje"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Gotovo"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona proširivanja"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite tipku radnji na tastaturi"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Odlično!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Izvršili ste pokret za prikaz svih aplikacija"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija vodiča; pauziranje i nastavak reprodukcije klikom."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tastature"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrole za dom"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index ba3c4adccb42..3386dc0775ca 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Per afegir la drecera Widgets, assegura\'t que l\'opció Mostra els widgets a la pantalla de bloqueig estigui activada a la configuració."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Configuració"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Botó Mostra l\'estalvi de pantalla"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Canvia d\'usuari"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Totes les aplicacions i les dades d\'aquesta sessió se suprimiran."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificacions"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Converses"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Esborra totes les notificacions silencioses"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Obre la configuració de notificacions"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificacions pausades pel mode No molestis"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No hi ha cap notificació}=1{{mode} ha posat en pausa les notificacions}=2{{mode} i un altre mode han posat en pausa les notificacions}many{{mode} i # de modes més han posat en pausa les notificacions}other{{mode} i # modes més han posat en pausa les notificacions}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Comença ara"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seguiment del cap"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toca per canviar el mode de timbre"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"mode de timbre"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>; toca per canviar el mode de timbre."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenciar"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"deixar de silenciar"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Bloqueja la pantalla"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Crea una nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasca"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Utilitza la pantalla dividida amb l\'aplicació actual a la dreta"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Utilitza la pantalla dividida amb l\'aplicació actual a l\'esquerra"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Canvia de pantalla dividida a pantalla completa"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Canvia a l\'aplicació de la dreta o de sota amb la pantalla dividida"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Canvia a l\'aplicació de l\'esquerra o de dalt amb la pantalla dividida"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Durant el mode de pantalla dividida: substitueix una app per una altra"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icona de la tecla d\'acció o Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Icona del signe més"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personalitza"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Restableix"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Fet"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Desplega la icona"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Prem la tecla d\'acció al teclat"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Enhorabona!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Has completat el gest per veure totes les aplicacions"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animació del tutorial; fes clic per posar en pausa i reprendre la reproducció."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroil·luminació del teclat"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivell %1$d de %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Controls de la llar"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 317061f07edf..c5aea85af4c7 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"K otevření aplikace pomocí widgetu budete muset ověřit svou totožnost. Také mějte na paměti, že widgety uvidí kdokoli, i když tablet bude uzamčen. Některé widgety nemusí být pro obrazovku uzamčení určeny a nemusí být bezpečné je na ni přidat."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Rozumím"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgety"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Pokud chcete přidat zkratku Widgety, zapněte v nastavení možnost Zobrazovat widgety na obrazovce uzamčení."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Nastavení"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Zobrazit tlačítko spořiče obrazovky"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Přepnout uživatele"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rozbalovací nabídka"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Veškeré aplikace a data v této relaci budou vymazána."</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Oznámení"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazat všechna tichá oznámení"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Otevřít nastavení oznámení"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Oznámení jsou pozastavena režimem Nerušit"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Žádná oznámení}=1{Oznámení jsou pozastavená režimem {mode}}=2{Oznámení jsou pozastavená režimem {mode} a 1 dalším}few{Oznámení jsou pozastavená režimem {mode} a # dalšími}many{Oznámení jsou pozastavená režimem {mode} a # dalšího}other{Oznámení jsou pozastavená režimem {mode} a # dalšími}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Spustit"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Sledování hlavy"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Klepnutím změníte režim vyzvánění"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"režim vyzvánění"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, klepnutím změníte režim vyzvánění"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"vypnout zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"zapnout zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrovat"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Uzamknout obrazovku"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Vytvořit poznámku"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Použít rozdělenou obrazovku se stávající aplikací vpravo"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Použít rozdělenou obrazovku se stávající aplikací vlevo"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Přepnout z rozdělené obrazovky na celou obrazovku"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Přepnout na aplikaci vpravo nebo dole v režimu rozdělené obrazovky"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Přepnout na aplikaci vlevo nebo nahoře v režimu rozdělené obrazovky"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Klávesové zkratky"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Přizpůsobení klávesových zkratek"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Odstrabit zkratku?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Resetovat do výchozího nastavení?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Nastavte zkratku stisknutím klávesy"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Vlastní zkratka se trvale smaže."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tím trvale odstraníte všechny své vlastní zkratky."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Vyhledat zkratky"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Žádné výsledky hledání"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sbalení"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikona klávesy Akce nebo Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikona Plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Přizpůsobit"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Resetovat"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Hotovo"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalení"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"nebo"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Nastavení klávesnice"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Nastavit zkratku"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Odstranit"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ano, resetovat"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Zrušit"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Stiskněte klávesu"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinace kláves se už používá. Použijte jinou klávesu."</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Stiskněte akční klávesu na klávesnici"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Výborně!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Provedli jste gesto k zobrazení všech aplikací"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Výuková animace, kliknutím pozastavíte nebo obnovíte."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvícení klávesnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Úroveň %1$d z %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Ovládání domácnosti"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 3c0dc42c0b05..168afad1817c 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Hvis du vil åbne en app ved hjælp af en widget, skal du verificere din identitet. Husk også, at alle kan se dem, også når din tablet er låst. Nogle widgets er muligvis ikke beregnet til låseskærmen, og det kan være usikkert at tilføje dem her."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"OK"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Hvis du vil tilføje genvejen \"Widgets\", skal du sørge for, at \"Vis widgets på låseskærmen\" er aktiveret i indstillingerne."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Indstillinger"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skift bruger"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullemenu"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifikationer"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ryd alle lydløse notifikationer"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Åbn indstillinger for notifikationer"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikationer er sat på pause af Forstyr ikke"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ingen notifikationer}=1{Notifikationer er sat på pause af {mode}}=2{Notifikationer er sat på pause af {mode} og én anden tilstand}one{Notifikationer er sat på pause af {mode} og # anden tilstand}other{Notifikationer er sat på pause af {mode} og # andre tilstande}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start nu"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Hovedregistrering"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tryk for at ændre ringetilstand"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ringetilstand"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, tryk for at ændre ringetilstand"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"slå lyden fra"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"slå lyden til"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrer"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skærm"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Skriv en note"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Brug opdelt skærm med aktuel app til højre"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Brug opdelt skærm med aktuel app til venstre"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skift fra opdelt skærm til fuld skærm"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skift til en app til højre eller nedenfor, når du bruger opdelt skærm"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skift til en app til venstre eller ovenfor, når du bruger opdelt skærm"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Ved opdelt skærm: Udskift én app med en anden"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Tastaturgenveje"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Tilpas tastaturgenveje"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Skal genvejen fjernes?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vil du nulstille til standard?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tryk på en tast for at tildele genvej"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Denne handling sletter din tilpassede genvej permanent."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Denne handling sletter alle dine tilpassede genveje permanent."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Genveje til søgning"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Der er ingen søgeresultater"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon for Skjul"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikon for handlingstast eller metatast"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plusikon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Tilpas"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Nulstil"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Udfør"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon for Udvid"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Tastaturindstillinger"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Konfigurer genvej"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Fjern"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, nulstil"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annuller"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tryk på en tast"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tastekombinationen er allerede i brug. Prøv en anden tast."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tryk på handlingstasten på dit tastatur"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Flot klaret!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du har udført bevægelsen for at se alle apps"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation med vejledning. Klik for at sætte afspilningen på pause og genoptage den."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturets baggrundslys"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d af %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Hjemmestyring"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 8d13524c951f..bf323ddbb2f6 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Wenn du eine App mit einem Widget öffnen möchtest, musst du deine Identität bestätigen. Beachte auch, dass jeder die Widgets sehen kann, auch wenn dein Tablet gesperrt ist. Einige Widgets sind möglicherweise nicht für den Sperrbildschirm vorgesehen, sodass es unsicher sein kann, sie hier hinzuzufügen."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Ok"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Zum Hinzufügen der Verknüpfung „Widgets“ musst du zuerst in den Einstellungen die Option „Widgets auf Sperrbildschirm zeigen“ aktivieren."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Einstellungen"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Nutzer wechseln"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Pull-down-Menü"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Benachrichtigungen"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Unterhaltungen"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle lautlosen Benachrichtigungen löschen"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Benachrichtigungseinstellungen öffnen"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Benachrichtigungen durch „Bitte nicht stören“ pausiert"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Keine Benachrichtigungen}=1{Benachrichtigungen durch {mode} pausiert}=2{Benachrichtigungen durch {mode} und einen weiteren Modus pausiert}other{Benachrichtigungen durch {mode} und # weitere Modi pausiert}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Jetzt starten"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Erfassung von Kopfbewegungen"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Zum Ändern des Klingeltonmodus tippen"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"Klingeltonmodus"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, zum Ändern des Klingeltonmodus tippen"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"Stummschalten"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"Aufheben der Stummschaltung"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"Vibrieren lassen"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Bildschirm sperren"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Notiz machen"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Splitscreen mit der aktuellen App auf der rechten Seite nutzen"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Splitscreen mit der aktuellen App auf der linken Seite nutzen"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vom Splitscreen zum Vollbild wechseln"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Im Splitscreen-Modus zu einer App rechts oder unten wechseln"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Im Splitscreen-Modus zu einer App links oder oben wechseln"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Im Splitscreen: eine App durch eine andere ersetzen"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Tastenkürzel"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Tastenkombinationen anpassen"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Tastenkombination entfernen?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Auf Standardeinstellung zurücksetzen?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Drücke eine Taste, um eine Tastenkombination festzulegen"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Dadurch wird die benutzerdefinierte Tastenkombination endgültig gelöscht."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Dadurch werden alle deine benutzerdefinierten Tastenkombinationen endgültig gelöscht."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Tastenkürzel suchen"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Keine Suchergebnisse"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Symbol „Minimieren“"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Symbol für Aktions- oder Meta-Taste"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plussymbol"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Anpassen"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Zurücksetzen"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Fertig"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Symbol „Maximieren“"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oder"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Tastatureinstellungen"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Tastenkombination festlegen"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Entfernen"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, zurücksetzen"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Abbrechen"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Taste drücken"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Diese Tastenkombination wird bereits verwendet. Versuche es mit einer anderen Taste."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Drücke die Aktionstaste auf deiner Tastatur"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Perfekt!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du hast das Tutorial für die Touch-Geste zum Aufrufen aller Apps abgeschlossen"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation während des Tutorials, zum Pausieren und Fortsetzen der Wiedergabe klicken."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturbeleuchtung"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d von %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Smart-Home-Steuerung"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index b6de5393087d..a90f70122a2c 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Για να ανοίξετε μια εφαρμογή χρησιμοποιώντας ένα γραφικό στοιχείο, θα πρέπει να επαληθεύσετε την ταυτότητά σας. Επίσης, λάβετε υπόψη ότι η προβολή τους είναι δυνατή από οποιονδήποτε, ακόμα και όταν το tablet σας είναι κλειδωμένο. Ορισμένα γραφικά στοιχεία μπορεί να μην προορίζονται για την οθόνη κλειδώματος και η προσθήκη τους εδώ ενδέχεται να μην είναι ασφαλής."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Το κατάλαβα"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Για να προσθέσετε τη συντόμευση Γραφικά στοιχεία, βεβαιωθείτε ότι η ρύθμιση Εμφάνιση γραφικών στοιχείων στην οθόνη κλειδώματος είναι ενεργοποιημένη στις ρυθμίσεις."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Ρυθμίσεις"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Εμφάνιση κουμπιού προφύλαξης οθόνης"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Εναλλαγή χρήστη"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"αναπτυσσόμενο μενού"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Όλες οι εφαρμογές και τα δεδομένα αυτής της περιόδου σύνδεσης θα διαγραφούν."</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Ειδοποιήσεις"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Συζητήσεις"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Διαγραφή όλων των ειδοποιήσεων σε σίγαση"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Άνοιγμα ρυθμίσεων ειδοποιήσεων"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία \"Μην ενοχλείτε\""</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Δεν υπάρχουν ειδοποιήσεις}=1{Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία {mode}}=2{Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία {mode} και μία άλλη λειτουργία}other{Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία {mode} και # άλλες λειτουργίες}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Έναρξη τώρα"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Παρακ. κίνησ. κεφαλής"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Πατήστε για να αλλάξετε τη λειτουργία ειδοποίησης ήχου"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"λειτουργία ειδοποίησης ήχου"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, πατήστε για αλλαγή της λειτουργίας ειδοποίησης ήχου"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"σίγαση"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"κατάργηση σίγασης"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"δόνηση"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Κλείδωμα οθόνης"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Δημιουργία σημείωσης"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Πολυδιεργασία"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Χρήση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα δεξιά"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Χρήση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα αριστερά"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Εναλλαγή από διαχωρισμό οθόνης σε πλήρη οθόνη"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Εναλλαγή στην εφαρμογή δεξιά ή κάτω κατά τη χρήση διαχωρισμού οθόνης"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Εναλλαγή σε εφαρμογή αριστερά ή επάνω κατά τη χρήση διαχωρισμού οθόνης"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Συντομεύσεις πληκτρολογίου"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Προσαρμογή συντομεύσεων πληκτρολογίου"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Κατάργηση συντόμευσης;"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Επαναφορά στις προεπιλογές;"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Πατήστε το πλήκτρο για ανάθεση της συντόμευσης"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Με αυτή την ενέργεια, η προσαρμοσμένη συντόμευση θα διαγραφεί οριστικά."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Με αυτή την ενέργεια θα διαγραφούν οριστικά όλες οι προσαρμοσμένες συντομεύσεις."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Συντομεύσεις αναζήτησης"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Κανένα αποτέλεσμα αναζήτησης"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Εικονίδιο σύμπτυξης"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Εικονίδιο πλήκτρου ενέργειας ή Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Εικονίδιο συν"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Προσαρμογή"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Επαναφορά"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Τέλος"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Εικονίδιο ανάπτυξης"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ή"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Ρυθμίσεις πληκτρολογίου"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Ορισμός συντόμευσης"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Κατάργηση"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ναι, επαναφορά"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Ακύρωση"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Πατήστε ένα πλήκτρο"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ο συνδυασμός πλήκτρων χρησιμοποιείται ήδη. Δοκιμάστε άλλο πλήκτρο."</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Πατήστε το πλήκτρο ενέργειας στο πληκτρολόγιό σας"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Μπράβο!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Ολοκληρώσατε την κίνηση για την προβολή όλων των εφαρμογών"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Κινούμενη εικόνα οδηγού, κάντε κλικ για παύση και συνέχιση της αναπαραγωγής."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Οπίσθιος φωτισμός πληκτρολογίου"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Επίπεδο %1$d από %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Οικιακοί έλεγχοι"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 609e7afc2109..679684a31ee7 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"To open an app using a widget, you\'ll need to verify that it\'s you. Also, bear in mind that anyone can view them, even when your tablet\'s locked. Some widgets may not have been intended for your lock screen and may be unsafe to add here."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Got it"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"To add the \'Widgets\' shortcut, make sure that \'Show widgets on lock screen\' is enabled in settings."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Settings"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Open notifications settings"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Head tracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tap to change ringer mode"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ringer mode"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, tap to change ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Take a note"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multi-tasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Use split screen with current app on the right"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Use split screen with current app on the left"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Keyboard shortcuts"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Customise keyboard shortcuts"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remove shortcut?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset back to default?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Press key to assign shortcut"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"This will delete your custom shortcut permanently."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"This will delete all your custom shortcuts permanently."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Search shortcuts"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"No search results"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Action or Meta key icon"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plus icon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Customise"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Reset"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Done"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Keyboard settings"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Set shortcut"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Remove"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yes, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Press key"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Key combination already in use. Try another key."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"You completed the view all apps gesture"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animation, click to pause and resume play."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index be4e81fd1fb7..f54745dfc3a5 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"To add the \"Widgets\" shortcut, make sure \"Show widgets on lock screen\" is enabled in settings."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Settings"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Show screensaver button"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string> @@ -871,9 +872,9 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Take a note"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Use split screen with current app on the right"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Use split screen with current app on the left"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string> + <string name="system_multitasking_rhs" msgid="8779289852395243004">"Use split screen with app on the right"</string> + <string name="system_multitasking_lhs" msgid="7348595296208696452">"Use split screen with app on the left"</string> + <string name="system_multitasking_full_screen" msgid="4940465971687159429">"Switch to full screen"</string> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to app on right or below while using split screen"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to app on left or above while using split screen"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: replace an app from one to another"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 609e7afc2109..679684a31ee7 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"To open an app using a widget, you\'ll need to verify that it\'s you. Also, bear in mind that anyone can view them, even when your tablet\'s locked. Some widgets may not have been intended for your lock screen and may be unsafe to add here."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Got it"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"To add the \'Widgets\' shortcut, make sure that \'Show widgets on lock screen\' is enabled in settings."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Settings"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Open notifications settings"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Head tracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tap to change ringer mode"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ringer mode"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, tap to change ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Take a note"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multi-tasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Use split screen with current app on the right"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Use split screen with current app on the left"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Keyboard shortcuts"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Customise keyboard shortcuts"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remove shortcut?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset back to default?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Press key to assign shortcut"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"This will delete your custom shortcut permanently."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"This will delete all your custom shortcuts permanently."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Search shortcuts"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"No search results"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Action or Meta key icon"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plus icon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Customise"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Reset"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Done"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Keyboard settings"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Set shortcut"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Remove"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yes, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Press key"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Key combination already in use. Try another key."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"You completed the view all apps gesture"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animation, click to pause and resume play."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 609e7afc2109..679684a31ee7 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"To open an app using a widget, you\'ll need to verify that it\'s you. Also, bear in mind that anyone can view them, even when your tablet\'s locked. Some widgets may not have been intended for your lock screen and may be unsafe to add here."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Got it"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"To add the \'Widgets\' shortcut, make sure that \'Show widgets on lock screen\' is enabled in settings."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Settings"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Open notifications settings"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Head tracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tap to change ringer mode"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ringer mode"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, tap to change ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Take a note"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multi-tasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Use split screen with current app on the right"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Use split screen with current app on the left"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Keyboard shortcuts"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Customise keyboard shortcuts"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remove shortcut?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset back to default?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Press key to assign shortcut"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"This will delete your custom shortcut permanently."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"This will delete all your custom shortcuts permanently."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Search shortcuts"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"No search results"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Action or Meta key icon"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plus icon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Customise"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Reset"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Done"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Keyboard settings"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Set shortcut"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Remove"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yes, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Press key"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Key combination already in use. Try another key."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"You completed the view all apps gesture"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animation, click to pause and resume play."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 177e6900e351..ca53976cd3fb 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Para abrir una app usando un widget, debes verificar tu identidad. Además, ten en cuenta que cualquier persona podrá verlo, incluso cuando la tablet esté bloqueada. Es posible que algunos widgets no se hayan diseñados para la pantalla de bloqueo y podría ser peligroso agregarlos allí."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Entendido"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Para agregar el acceso directo de \"Widgets\", asegúrate de que la opción \"Mostrar widgets en la pantalla de bloqueo\" esté habilitada en la configuración."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Configuración"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Botón para mostrar el protector de pantalla"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú expandible"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Se eliminarán las aplicaciones y los datos de esta sesión."</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificaciones"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Abrir configuración de notificaciones"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo \"No interrumpir\""</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No hay notificaciones}=1{{mode} pausó las notificaciones}=2{{mode} y un modo más pausaron las notificaciones}many{{mode} y # de modos más pausaron las notificaciones}other{{mode} y # modos más pausaron las notificaciones}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Comenzar ahora"</string> @@ -874,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Bloquear la pantalla"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Crear una nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Tareas múltiples"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Usar la pantalla dividida con la app actual a la derecha"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Usar la pantalla dividida con la app actual a la izquierda"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ubicar la app a la derecha o abajo cuando usas la pantalla dividida"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ubicar la app a la izquierda o arriba cuando usas la pantalla dividida"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante pantalla dividida: Reemplaza una app con otra"</string> @@ -1429,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Combinaciones de teclas"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personaliza las combinaciones de teclas"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"¿Quieres quitar el acceso directo?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"¿Quieres restablecer la configuración predeterminada?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Presiona la tecla para asignar el acceso directo"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Esta acción borrará tu acceso directo personalizado de forma permanente."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Esta acción borrará todos tus accesos directos personalizados de forma permanente."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Buscar combinaciones de teclas"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"La búsqueda no arrojó resultados"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícono de contraer"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ícono tecla meta o de acción"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"ícono de signo más"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personalizar"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Restablecer"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Listo"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícono de expandir"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> @@ -1452,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Configuración del teclado"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Establecer combinación de teclas"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Quitar"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sí, restablecer"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Presiona una tecla"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"La combinación de teclas ya está en uso. Prueba con otra."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 53289d141b0e..28812cca3c43 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Para añadir el acceso directo Widgets, asegúrate de que la opción Mostrar widgets en la pantalla de bloqueo esté habilitada en los ajustes."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Ajustes"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar de usuario"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Se eliminarán todas las aplicaciones y datos de esta sesión."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificaciones"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Abrir los ajustes de notificaciones"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo No molestar"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No hay notificaciones}=1{Notificaciones pausadas por {mode}}=2{Notificaciones pausadas por {mode} y un modo más}many{Notificaciones pausadas por {mode} y # modos más}other{Notificaciones pausadas por {mode} y # modos más}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Empezar ahora"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seguimiento de cabeza"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toca para cambiar el modo de timbre"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modo de timbre"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, toca para cambiar el modo de timbre"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenciar"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"dejar de silenciar"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Escribir una nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitarea"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Usar la pantalla dividida con la aplicación actual a la derecha"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Usar la pantalla dividida con la aplicación actual a la izquierda"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Cambiar a la aplicación de la derecha o de abajo en pantalla dividida"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Cambiar a la app de la izquierda o de arriba en pantalla dividida"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Con pantalla dividida: reemplazar una aplicación por otra"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icono de la tecla de acción o de la tecla Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Icono de más"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personalizar"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Restablecer"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Hecho"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icono de desplegar"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pulsa la tecla de acción de tu teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"¡Muy bien!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Has completado el gesto para ver todas las aplicaciones"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animación del tutorial, haz clic para pausar y reanudar la reproducción."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación del teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Controles de la casa"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 165f9c25c2b1..2c0c378e34ed 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Rakenduse avamiseks vidina abil peate kinnitama, et see olete teie. Samuti pidage meeles, et kõik saavad vidinaid vaadata, isegi kui teie tahvelarvuti on lukus. Mõni vidin ei pruugi olla ette nähtud teie lukustuskuva jaoks ja seda pole turvaline siia lisada."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Selge"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Vidinad"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Otsetee „Vidinad“ lisamiseks veenduge, et seadetes oleks valik „Kuva lukustuskuval vidinad“ lubatud."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Seaded"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kasutaja vahetamine"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rippmenüü"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Märguanded"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Vestlused"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kustuta kõik hääletud märguanded"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Avage märguandeseaded"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Režiim Mitte segada peatas märguanded"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Märguandeid pole}=1{{mode} peatas märguanded}=2{{mode} ja veel üks režiim peatasid märguanded}other{{mode} ja veel # režiimi peatasid märguanded}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Alusta kohe"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pea jälgimine"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Puudutage telefonihelina režiimi muutmiseks"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"telefonihelina režiim"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, puudutage telefonihelina režiimi muutmiseks"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"vaigistamine"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"vaigistuse tühistamine"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibreerimine"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lukustuskuva"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Märkme tegemine"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitegumtöö"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Jagatud ekraanikuva kasutamine, praegune rakendus kuvatakse paremal"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Jagatud ekraanikuva kasutamine, praegune rakendus kuvatakse vasakul"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Jagatud ekraanikuvalt täisekraanile lülitamine"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Paremale või alumisele rakendusele lülitamine jagatud ekraani ajal"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Vasakule või ülemisele rakendusele lülitamine jagatud ekraani ajal"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekraanikuva jagamise ajal: ühe rakenduse asendamine teisega"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Klaviatuuri otseteed"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Klaviatuuri otseteede kohandamine"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Kas soovite otsetee eemaldada?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Kas lähtestada vaikeseadele?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Otsetee lisamiseks vajutage klahvi"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"See kustutab teie kohandatud otsetee jäädavalt."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"See kustutab kõik teie kohandatud otseteed jäädavalt."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Otsige otseteid"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Otsingutulemused puuduvad"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ahendamisikoon"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Toiming või metaklahv"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Pluss-ikoon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Kohandamine"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Lähtesta"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Valmis"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laiendamisikoon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"või"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Klaviatuuri seaded"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Määrake otsetee"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Eemalda"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Jah, lähtesta"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Tühista"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Vajutage klahvi"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Klahvikombinatsioon on juba kasutusel. Proovige mõnda muud klahvi."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Vajutage klaviatuuril toiminguklahvi"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Hästi tehtud!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Tegite kõigi rakenduste vaatamise liigutuse"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Õpetlik animatsioon, klõpsake esitamise peatamiseks ja jätkamiseks."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatuuri taustavalgustus"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tase %1$d/%2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kodu juhtelemendid"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 46bbdc3dd3c0..cfd6c6a5e495 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Aplikazio bat widget baten bidez irekitzeko, zeu zarela egiaztatu beharko duzu. Gainera, kontuan izan edonork ikusi ahalko dituela halako widgetak, tableta blokeatuta badago ere. Baliteke widget batzuk pantaila blokeaturako egokiak ez izatea, eta agian ez da segurua haiek bertan gehitzea."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Ados"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgetak"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"Widgetak\" lasterbidea gehitzeko, ziurtatu \"Erakutsi widgetak pantaila blokeatuan\" gaituta dagoela ezarpenetan."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Ezarpenak"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Aldatu erabiltzailea"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"zabaldu menua"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Jakinarazpenak"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Elkarrizketak"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Garbitu soinurik gabeko jakinarazpen guztiak"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Ireki jakinarazpen-ezarpenak"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ez molestatzeko moduak pausatu egin ditu jakinarazpenak"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ez dago jakinarazpenik}=1{Modu honek jakinarazpenak pausatu ditu: {mode}}=2{Modu honek eta beste modu batek jakinarazpenak pausatu dituzte: {mode}}other{Modu honek eta beste # moduk jakinarazpenak pausatu dituzte: {mode}}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Hasi"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Buruaren jarraipena"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Sakatu tonu-jotzailearen modua aldatzeko"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"tonu-jotzailearen modua"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Sakatu tonu-jotzailearen modua aldatzeko."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"desaktibatu audioa"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"aktibatu audioa"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"dardara"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Blokeatu pantaila"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Egin ohar bat"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Zeregin bat baino gehiago aldi berean exekutatzea"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Erabili pantaila zatitua eta ezarri aplikazio hau eskuinean"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Erabili pantaila zatitua eta ezarri aplikazio hau ezkerrean"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Aldatu pantaila zatitutik pantaila osora"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Aldatu eskuineko edo beheko aplikaziora pantaila zatitua erabiltzean"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Aldatu ezkerreko edo goiko aplikaziora pantaila zatitua erabiltzean"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Pantaila zatituan zaudela, ordeztu aplikazio bat beste batekin"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Lasterbideak"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Pertsonalizatu lasterbideak"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Lasterbidea kendu nahi duzu?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Balio lehenetsia berrezarri nahi duzu?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Sakatu tekla lasterbidea esleitzeko"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Betiko ezabatuko da lasterbide pertsonalizatua."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Lasterbide pertsonalizatu guztiak betiko ezabatuko dira."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Bilatu lasterbideak"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Ez dago bilaketa-emaitzarik"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tolesteko ikonoa"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ekintzaren edo Meta teklaren ikonoa"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plus-ikonoa"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Pertsonalizatu"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Berrezarri"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Eginda"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Zabaltzeko ikonoa"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"edo"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Teklatuaren ezarpenak"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Ezarri lasterbidea"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Kendu"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Bai, berrezarri"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Utzi"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Sakatu tekla"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tekla-konbinazio hori erabili da dagoeneko. Probatu beste tekla bat."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Sakatu teklatuko ekintza-tekla"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bikain!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Osatu duzu aplikazio guztiak ikusteko keinua"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorialeko animazioa. Sakatu pausatzeko eta erreproduzitzeari berrekiteko."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Teklatuaren hondoko argia"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d/%2$d maila"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Etxeko gailuen kontrola"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 5e68a95cbecb..163d84bd8239 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"برای باز کردن برنامه بااستفاده از ابزاره، باید هویت خودتان را بهتأیید برسانید. همچنین، بهخاطر داشته باشید که همه میتوانند آنها را مشاهده کنند، حتی وقتی رایانه لوحیتان قفل است. برخیاز ابزارهها ممکن است برای صفحه قفل درنظر گرفته نشده باشند و ممکن است اضافه کردن آنها در اینجا ناامن باشد."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"متوجهام"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ابزارهها"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"برای افزودن میانبر «ابزارهها»، مطمئن شوید «نمایش ابزارهها در صفحه قفل» در تنظیمات فعال باشد."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"تنظیمات"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"تغییر کاربر"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"منوی پایینپر"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"اعلانها"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"مکالمهها"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"پاک کردن همه اعلانهای بیصدا"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"باز کردن تنظیمات اعلان"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"اعلانها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{اعلانی موقتاً متوقف نشده است}=1{اعلانها را «{mode}» موقتاً متوقف کرده است}=2{اعلانها را «{mode}» و یک حالت دیگر موقتاً متوقف کرداند}one{اعلانها را «{mode}» و # حالت دیگر موقتاً متوقف کردهاند}other{اعلانها را «{mode}» و # حالت دیگر موقتاً متوقف کردهاند}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"اکنون شروع کنید"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ردیابی سر"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"برای تغییر حالت زنگ، تکضرب بزنید"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"حالت زنگ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>، برای تغییر حالت زنگ تکضرب بزنید"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"صامت کردن"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"باصدا کردن"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"لرزش"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"قفل صفحه"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"یادداشتبرداری"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"چندوظیفگی"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"استفاده از صفحهٔ دونیمه با برنامه فعلی در سمت راست"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"استفاده از صفحهٔ دونیمه با برنامه فعلی در سمت چپ"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"جابهجایی از صفحهٔ دونیمه به تمام صفحه"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"رفتن به برنامه سمت راست یا پایین درحین استفاده از صفحهٔ دونیمه"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"رفتن به برنامه سمت چپ یا بالا درحین استفاده از صفحهٔ دونیمه"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"درحین صفحهٔ دونیمه: برنامهای را با دیگری جابهجا میکند"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"میانبرهای صفحهکلید"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"سفارشیسازی کردن میانبرهای صفحهکلید"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"میانبر حذف شود؟"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"به تنظیم پیشفرض بازنشانی میکنید؟"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"برای اختصاص دادن میانبر، کلید را فشار دهید"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"با این کار، میانبر سفارشی شما برای همیشه حذف میشود."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"با این کار، همه میانبرهای سفارشی برای همیشه حذف خواهند شد."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"جستجوی میانبرها"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"نتیجهای برای جستجو پیدا نشد"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"نماد جمع کردن"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"نماد کلید کنش یا متا"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"نماد جمع"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"سفارشیسازی کردن"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"بازنشانی"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"تمام"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"نماد ازهم بازکردن"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"تنظیمات صفحهکلید"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"تنظیم میانبر"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"حذف"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"بله، بازنشانی شود"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"لغو"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"کلید را فشار دهید"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ترکیب کلید ازقبل درحال استفاده است. کلید دیگری را امتحان کنید."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"دکمه کنش را روی صفحه لمسی فشار دهید"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"عالی بود!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"اشاره «مشاهده همه برنامهها» را تمام کردید"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"پویانمایی آموزش گامبهگام، برای توقف موقت و ازسرگیری پخش کلیک کنید."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"نور پسزمینه صفحهکلید"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"سطح %1$d از %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"کنترل خانه هوشمند"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 94b63649349c..1caac76c623e 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgetit"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Jos haluat lisätä Widgetit-pikakuvakkeen, varmista, että \"Näytä widgetit lukitusnäytöllä\" on käytössä asetuksissa."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Asetukset"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Vaihda käyttäjää"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"alasvetovalikko"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Kaikki sovellukset ja tämän istunnon tiedot poistetaan."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Ilmoitukset"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Keskustelut"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Tyhjennä kaikki hiljaiset ilmoitukset"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Avaa ilmoitusasetukset"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Älä häiritse ‑tila keskeytti ilmoitukset"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ei ilmoituksia}=1{{mode} keskeytti ilmoitukset}=2{{mode} ja yksi muu tila keskeytti ilmoitukset}other{{mode} ja # muuta tilaa keskeytti ilmoitukset}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Aloita nyt"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pään seuranta"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Vaihda soittoäänen tilaa napauttamalla"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"Soittoäänen tila"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, vaihda soittoäänen tilaa napauttamalla"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mykistä"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"poista mykistys"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"värinä"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lukitse näyttö"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Tee muistiinpano"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitaskaus"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Käytä jaettua näyttöä niin, että nyt käytettävä sovellus on oikealla"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Käytä jaettua näyttöä niin, että nyt käytettävä sovellus on vasemmalla"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vaihda jaetusta näytöstä koko näyttöön"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Vaihda sovellukseen oikealla tai alapuolella jaetussa näytössä"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Vaihda sovellukseen vasemmalla tai yläpuolella jaetussa näytössä"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Jaetun näytön aikana: korvaa sovellus toisella"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Toiminto- tai Meta-näppäinkuvake"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Pluskuvake"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Muokkaa"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Nollaa"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Valmis"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laajennuskuvake"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"tai"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Paina näppäimistön toimintonäppäintä"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Hienoa!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Olet oppinut Näytä kaikki sovellukset ‑eleen."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Ohjeanimaatio, klikkaa keskeyttääksesi ja jatkaaksesi."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Näppämistön taustavalo"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Taso %1$d/%2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kodin ohjaus"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index ea9ee0b42c2d..6d56ac1abf26 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Pour ouvrir une appli à l\'aide d\'un widget, vous devrez confirmer votre identité. En outre, gardez à l\'esprit que tout le monde peut voir les widgets, même lorsque votre tablette est verrouillée. Certains widgets n\'ont peut-être pas été conçus pour votre écran de verrouillage, et il pourrait être dangereux de les ajouter ici."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"OK"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Pour ajouter le raccourci « Widgets », assurez-vous que « Afficher les widgets sur l\'écran de verrouillage » est activé dans les paramètres."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Paramètres"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Ouvrir les paramètres des notifications"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Les notifications sont suspendues par le mode Ne pas déranger"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Aucune notification}=1{Notifications suspendues par {mode}}=2{Notifications suspendues par {mode} et un autre mode}one{Notifications suspendues par {mode} et # autre mode}many{Notifications suspendues par {mode} et # d\'autres modes}other{Notifications suspendues par {mode} et # autres modes}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Suivi de la tête"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Touchez pour modifier le mode de sonnerie"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"mode de sonnerie"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, toucher ici pour modifier le mode de la sonnerie"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"désactiver le son"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"réactiver le son"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibration"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Verrouiller l\'écran"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Prendre une note"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitâche"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Utiliser l\'Écran divisé avec l\'appli actuelle à droite"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Utiliser l\'Écran divisé avec l\'appli actuelle à gauche"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'Écran divisé au plein écran"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passer à l\'appli à droite ou en dessous avec l\'Écran divisé"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passer à l\'appli à gauche ou au-dessus avec l\'Écran divisé"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode d\'écran divisé : remplacer une appli par une autre"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Raccourcis-clavier"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personnaliser les raccourcis-clavier"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Supprimer le raccourci?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Réinitialiser aux raccourcis par défaut?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Appuyez sur la touche pour attribuer un raccourci"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Cela supprimera définitivement votre raccourci personnalisé."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Cette action supprimera définitivement tous vos raccourcis personnalisés."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Rechercher des raccourcis"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Aucun résultat de recherche"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icône de la touche Action ou Méta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Icône Plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personnaliser"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Réinitialiser"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Terminé"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Paramètres du clavier"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Définir un raccourci"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Supprimer"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Oui, réinitialiser"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annuler"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Appuyez sur la touche"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"La combinaison de touches est déjà utilisée. Essayez une autre touche."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Appuyez sur la touche d\'action de votre clavier"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Félicitations!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Vous avez appris le geste pour afficher toutes les applis"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation du tutoriel; cliquer ici pour mettre en pause et reprendre la lecture."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d de %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Domotique"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index bda70d970e13..fd9854b7b235 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Pour ouvrir une appli à l\'aide d\'un widget, vous devez confirmer qu\'il s\'agit bien de vous. N\'oubliez pas non plus que tout le monde peut voir vos widgets, même lorsque votre tablette est verrouillée. Certains d\'entre eux n\'ont pas été conçus pour l\'écran de verrouillage et les ajouter à cet endroit peut s\'avérer dangereux."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"OK"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Pour ajouter le raccourci \"Widgets\", assurez-vous que l\'option \"Afficher les widgets sur l\'écran de verrouillage\" est activée dans les paramètres."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Paramètres"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Ouvrir les paramètres de notification"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications suspendues par le mode Ne pas déranger"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Aucune notification}=1{Notifications suspendues par le mode {mode}}=2{Notifications suspendues par le mode {mode} et un autre mode}one{Notifications suspendues par le mode {mode} et # autre mode}many{Notifications suspendues par le mode {mode} et # d\'autres modes}other{Notifications suspendues par le mode {mode} et # autres modes}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Suivi de la tête"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Appuyez pour changer le mode de la sonnerie"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"mode de sonnerie"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, appuyez pour changer le mode de la sonnerie"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"couper le son"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"réactiver le son"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"activer le vibreur"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Verrouiller l\'écran"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Créer une note"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitâche"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Utiliser l\'écran partagé avec l\'appli actuelle sur la droite"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Utiliser l\'écran partagé avec l\'appli actuelle sur la gauche"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran partagé au plein écran"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passer à l\'appli à droite ou en dessous avec l\'écran partagé"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passez à l\'appli à gauche ou au-dessus avec l\'écran partagé"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode écran partagé : Remplacer une appli par une autre"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Raccourcis clavier"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personnaliser les raccourcis clavier"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Supprimer le raccourci ?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Rétablir les paramètres par défaut ?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Appuyez sur une touche pour attribuer un raccourci"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Votre raccourci personnalisé sera définitivement supprimé."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tous vos raccourcis personnalisés seront définitivement supprimés."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Rechercher des raccourcis"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Aucun résultat de recherche"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icône de touche d\'action ou de méta-touche"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Icône Plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personnaliser"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Réinitialiser"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"OK"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Paramètres du clavier"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Définir un raccourci"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Supprimer"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Oui, rétablir"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annuler"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Appuyez sur la touche"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Combinaison de touches déjà utilisée. Essayez une autre touche."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Appuyez sur la touche d\'action de votre clavier"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bravo !"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Vous avez appris le geste pour afficher toutes les applis"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation du tutoriel, cliquez pour mettre en pause et reprendre la lecture."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d sur %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Contrôle de la maison"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 53c4417b3305..96b858b62a7f 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Para abrir unha aplicación mediante un widget, tes que verificar a túa identidade. Ten en conta que pode velos calquera persoa, mesmo coa tableta bloqueada. Pode ser que algúns widgets non estean pensados para a túa pantalla de bloqueo, polo que talvez non sexa seguro engadilos aquí."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Entendido"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Para engadir o atallo Widgets, vai a Configuración e comproba que está activada a opción Mostrar widgets na pantalla de bloqueo."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Configuración"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú despregable"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificacións"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas as notificacións silenciadas"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Abrir a configuración de notificacións"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"O modo Non molestar puxo en pausa as notificacións"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Non hai ningunha notificación}=1{Notificacións postas en pausa polo modo {mode}}=2{Notificacións postas en pausa polo modo {mode} e un máis}other{Notificacións postas en pausa polo modo {mode} e # máis}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seguimento da cabeza"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toca para cambiar o modo de timbre"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modo de timbre"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, toca para cambiar o modo de timbre"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenciar"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"activar o son"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Crear nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitarefa"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Usar pantalla dividida coa aplicación actual na dereita"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Usar pantalla dividida coa aplicación actual na esquerda"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Cambiar á aplicación da dereita ou de abaixo coa pantalla dividida"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Cambiar á aplicación da esquerda ou de arriba coa pantalla dividida"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"En modo de pantalla dividida: Substituír unha aplicación por outra"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Atallos de teclado"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personalizar os atallos de teclado"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Queres quitar o atallo?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Queres restablecer a opción predeterminada?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Preme a tecla para asignar o atallo"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Eliminarase de forma permanente o teu atallo personalizado."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Eliminaranse permanentemente todos os teus atallos personalizados."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Busca atallos"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Non hai resultados de busca"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona de contraer"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icona da tecla Meta ou de acción"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Icona do signo máis"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personalizar"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Restablecer"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Feito"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona de despregar"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Configuración do teclado"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Definir atallo"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Quitar"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Si, restablecer"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Preme unha tecla"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Xa se está usando esta combinación de teclas. Proba con outra."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Preme a tecla de acción do teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Ben feito!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Completaches o titorial do xesto de ver todas as aplicacións"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animación do titorial, fai clic para poñelo en pausa ou retomar a reprodución."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación do teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Controis domóticos"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 8ff57172babb..fb494c1dd7dd 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"વિજેટ"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"વિજેટ\"નો શૉર્ટકટ ઉમેરવા માટે, ખાતરી કરો કે સેટિંગમાં \"લૉક સ્ક્રીન પર વિજેટ બતાવો\" સુવિધા ચાલુ કરેલી છે."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"સેટિંગ"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"વપરાશકર્તા સ્વિચ કરો"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"પુલડાઉન મેનૂ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"આ સત્રમાંની તમામ ઍપ અને ડેટા કાઢી નાખવામાં આવશે."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"નોટિફિકેશન"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"વાતચીત"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"બધા સાઇલન્ટ નોટિફિકેશન સાફ કરો"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"નોટિફિકેશનના સેટિંગ ખોલો"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{કોઈ નોટિફિકેશન નથી}=1{{mode} દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}=2{{mode} અને અન્ય એક મોડ દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}one{{mode} અને અન્ય # મોડ દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}other{{mode} અને અન્ય # મોડ દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"હવે શરૂ કરો"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"હૅડ ટ્રૅકિંગ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"રિંગર મોડ બદલવા માટે ટૅપ કરો"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"રિંગર મોડ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, રિંગર મોડ બદલવા માટે ટૅપ કરો"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"મ્યૂટ કરો"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"અનમ્યૂટ કરો"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"વાઇબ્રેટ"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"લૉક સ્ક્રીન"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"નોંધ લો"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"એકસાથે એકથી વધુ કાર્યો કરવા"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"જમણી બાજુએ વર્તમાન ઍપ સાથે વિભાજિત સ્ક્રીનનો ઉપયોગ કરો"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ડાબી બાજુએ વર્તમાન ઍપ સાથે વિભાજિત સ્ક્રીનનો ઉપયોગ કરો"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"વિભાજિત સ્ક્રીનથી પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે જમણી બાજુ કે નીચેની ઍપ પર સ્વિચ કરો"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે ડાબી બાજુની કે ઉપરની ઍપ પર સ્વિચ કરો"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ઍક્શન અથવા મેટા કીનું આઇકન"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"પ્લસનું આઇકન"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"કસ્ટમાઇઝ કરો"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"રીસેટ કરો"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"થઈ ગયું"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\'મોટું કરો\'નું આઇકન"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"અથવા"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"તમારા કીબોર્ડ પરની ઍક્શન કી દબાવો"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"વાહ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"તમે \'બધી ઍપ જુઓ\' સંકેત પૂર્ણ કર્યો"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ટ્યૂટૉરિઅલ ઍનિમેશન થોભાવવાનું અને ચલાવવાનું ફરી શરૂ કરવા માટે ક્લિક કરો."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"કીબોર્ડની બૅકલાઇટ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dમાંથી %1$d લેવલ"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ઘરેલું સાધનોના નિયંત્રણો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index d2f6e5a1d68d..c84a3eb936bb 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -450,7 +450,7 @@ <string name="zen_modes_dialog_done" msgid="6654130880256438950">"हो गया"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"सेटिंग"</string> <string name="zen_mode_on" msgid="9085304934016242591">"चालू है"</string> - <string name="zen_mode_on_with_details" msgid="7416143430557895497">"<xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g> • पर"</string> + <string name="zen_mode_on_with_details" msgid="7416143430557895497">"चालू है • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string> <string name="zen_mode_off" msgid="1736604456618147306">"बंद है"</string> <string name="zen_mode_set_up" msgid="8231201163894922821">"सेट नहीं है"</string> <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"सेटिंग में जाकर मैनेज करें"</string> @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"किसी विजेट से कोई ऐप्लिकेशन खोलने के लिए, आपको अपनी पहचान की पुष्टि करनी होगी. ध्यान रखें कि आपके टैबलेट के लॉक होने पर भी, कोई व्यक्ति विजेट देख सकता है. ऐसा हो सकता है कि कुछ विजेट, लॉक स्क्रीन पर दिखाने के लिए न बने हों. इन्हें लॉक स्क्रीन पर जोड़ना असुरक्षित हो सकता है."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"ठीक है"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"विजेट"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"विजेट\" शॉर्टकट जोड़ने के लिए, पक्का करें कि सेटिंग में \"लॉक स्क्रीन पर विजेट दिखाएं\" चालू हो."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"सेटिंग"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"स्क्रीन सेवर दिखाने का बटन"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"उपयोगकर्ता बदलें"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"पुलडाउन मेन्यू"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"इस सेशन के सभी ऐप्लिकेशन और डेटा को हटा दिया जाएगा."</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचनाएं"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"सूचना सेटिंग खोलें"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{कोई सूचना नहीं है}=1{{mode} की वजह से सूचना नहीं दिख रही है}=2{{mode} और एक अन्य मोड की वजह से सूचना नहीं दिख रही है}one{{mode} और # अन्य मोड की वजह से सूचना नहीं दिख रही है}other{{mode} और # अन्य मोड के की वजह से सूचनाएं नहीं दिख रही है}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"अभी शुरू करें"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"हेड ट्रैकिंग चालू है"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"रिंगर मोड बदलने के लिए टैप करें"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"रिंगर मोड"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, रिंगर मोड बदलने के लिए टैप करें"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्यूट करें"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"अनम्यूट करें"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"वाइब्रेशन की सुविधा चालू करें"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"स्क्रीन लॉक करने के लिए"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"नोट बनाने के लिए"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"मल्टीटास्किंग (एक साथ कई काम करना)"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"स्प्लिट स्क्रीन में मौजूदा ऐप्लिकेशन को दाईं ओर दिखाने के लिए"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"स्प्लिट स्क्रीन में मौजूदा ऐप्लिकेशन को बाईं ओर दिखाने के लिए"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर स्विच करने के लिए"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रीन पर, दाईं ओर या नीचे के ऐप पर स्विच करने के लिए"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रीन पर, बाईं ओर या ऊपर के ऐप पर स्विच करने के लिए"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे ऐप्लिकेशन से बदलें"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"कीबोर्ड शॉर्टकट"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"कीबोर्ड शॉर्टकट को पसंद के मुताबिक बनाएं"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"क्या आपको शॉर्टकट हटाना है?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"क्या आपको फिर से डिफ़ॉल्ट सेटिंग चालू करनी है?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"शॉर्टकट असाइन करने के लिए बटन दबाएं"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ऐसा करने से, आपका कस्टम शॉर्टकट हमेशा के लिए मिट जाएगा."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ऐसा करने पर, आपके सभी कस्टम शॉर्टकट हमेशा के लिए मिट जाएंगे."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"शॉर्टकट खोजें"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"खोज का कोई नतीजा नहीं मिला"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"छोटा करने का आइकॉन"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ऐक्शन या मेटा बटन का आइकॉन"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"प्लस का आइकॉन"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"पसंद के मुताबिक बनाएं"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"रीसेट करें"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"हो गया"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"बड़ा करने का आइकॉन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"या"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"कीबोर्ड सेटिंग"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"शॉर्टकट सेट करें"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"हटाएं"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"हां, रीसेट करें"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"रद्द करें"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"बटन दबाएं"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"बटन का यह कॉम्बिनेशन पहले से इस्तेमाल किया जा रहा है. कोई दूसरा कॉम्बिनेशन आज़माएं."</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"अपने कीबोर्ड पर ऐक्शन बटन दबाएं"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"बहुत खूब!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"अब आपको हाथ के जेस्चर का इस्तेमाल करके, सभी ऐप्लिकेशन देखने का तरीका पता चल गया है"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ट्यूटोरियल ऐनिमेशन को रोकने और इन्हें फिर से चलाने के लिए क्लिक करें."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"कीबोर्ड की बैकलाइट"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d में से %1$d लेवल"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"होम कंट्रोल"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index e566e4ef12c2..6eabb6a2a9c9 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgeti"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Da biste dodali prečac Widgeti, provjerite je li u postavkama omogućena opcija Prikaži widgete na zaključanom zaslonu."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Postavke"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Prikaži gumb čuvara zaslona"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Promjena korisnika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući izbornik"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Izbrisat će se sve aplikacije i podaci u ovoj sesiji."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Obavijesti"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Izbriši sve bešumne obavijesti"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Otvori postavke obavijesti"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Značajka Ne uznemiravaj pauzirala je Obavijesti"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nema obavijesti}=1{Obavijesti je pauzirao način {mode}}=2{Obavijesti su pauzirali način {mode} i još jedan način}one{Obavijesti su pauzirali način {mode} i još # način rada}few{Obavijesti su pauzirali način {mode} i još # načina rada}other{Obavijesti su pauzirali način {mode} i još # načina rada}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Pokreni"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Praćenje glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dodirnite da biste promijenili način softvera zvona"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"način softvera zvona"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, dodirnite da biste promijenili način softvera zvona"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"isključivanje zvuka"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"uključivanje zvuka"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje zaslona"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Pisanje bilješke"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Obavljanje više zadataka"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Koristite podijeljeni zaslon s trenutačnom aplikacijom s desne strane"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Koristite podijeljeni zaslon s trenutačnom aplikacijom s lijeve strane"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prelazak s podijeljenog zaslona na cijeli zaslon"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Prelazak na aplikaciju zdesna ili ispod uz podijeljeni zaslon"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Prelazak na aplikaciju slijeva ili iznad uz podijeljeni zaslon"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijekom podijeljenog zaslona: zamijeni aplikaciju drugom"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikona tipke za radnju odnosno meta tipka"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikona plusa"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Prilagodi"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Poništi"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Gotovo"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite tipku za radnju na tipkovnici"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Izvrsno!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Napravili ste pokret za prikaz svih aplikacija"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija u vodiču, kliknite za pauziranje i nastavak reprodukcije."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tipkovnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Razina %1$d od %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Upravljanje uređajima"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 0cbf0aac77f6..2ee7b24fbe7f 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Ha modul használatával szeretne megnyitni egy alkalmazást, igazolnia kell a személyazonosságát. Ne felejtse továbbá, hogy bárki megtekintheti a modulokat, még akkor is, amikor zárolva van a táblagép. Előfordulhat, hogy bizonyos modulokat nem a lezárási képernyőn való használatra terveztek, ezért nem biztonságos a hozzáadásuk."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Értem"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Modulok"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"A „Modulok” gyorsparancs hozzáadásához gondoskodjon arról, hogy a „Modulok megjelenítése a lezárási képernyőn” beállítás legyen engedélyezve a beállításokban."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Beállítások"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Felhasználóváltás"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"lehúzható menü"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Értesítések"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Beszélgetések"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Az összes néma értesítés törlése"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Értesítési beállítások megnyitása"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ne zavarjanak funkcióval szüneteltetett értesítések"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nincs értesítés}=1{A(z) {mode} szüneteltette az értesítéseket}=2{A(z) {mode} és egy másik mód szüneteltette az értesítéseket}other{A(z) {mode} és # másik mód szüneteltette az értesítéseket}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Indítás most"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Fejkövetés"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Koppintson a csengés módjának módosításához"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"csengés módja"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Koppintson a csörgés módjának módosításához."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"némítás"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"némítás feloldása"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"rezgés"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lezárási képernyő"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Jegyzetelés"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Osztott képernyő használata, a jelenlegi alkalmazás legyen jobb oldalt"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Osztott képernyő használata, a jelenlegi alkalmazás legyen bal oldalt"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Váltás osztott képernyőről teljes képernyőre"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Váltás a jobb oldalt, illetve lent lévő appra osztott képernyő esetén"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Váltás a bal oldalt, illetve fent lévő appra osztott képernyő esetén"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Osztott képernyőn: az egyik alkalmazás lecserélése egy másikra"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Billentyűparancsok"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"A billentyűparancsok személyre szabása"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Eltávolítja a billentyűparancsot?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Visszaállítja az alapértelmezett beállításokat?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Nyomja meg a billentyűt a billentyűparancs hozzárendeléséhez"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ezzel véglegesen törli az egyéni billentyűparancsot."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Ezzel véglegesen törli az összes egyéni billentyűparancsot."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Billentyűparancsok keresése"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Nincsenek keresési találatok"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Összecsukás ikon"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Művelet vagy Meta billentyű ikonja"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Pluszikon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Személyre szabás"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Visszaállítás"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Kész"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Kibontás ikon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vagy"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Billentyűzetbeállítások"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Billentyűparancs beállítása"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Eltávolítás"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Igen, visszaállítom"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Mégse"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Nyomja le a billentyűt"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"A billentyűkombináció már használatban van. Próbálkozzon másik billentyűvel."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Nyomja meg a műveletbillentyűt az érintőpadon."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Szép munka!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Teljesítette az összes alkalmazás megtekintésének kézmozdulatát."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Útmutató animáció. Kattintson a szüneteltetéshez és a lejátszás folytatásához."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"A billentyűzet háttérvilágítása"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Fényerő: %2$d/%1$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Otthon vezérlése"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 867e0dafbdec..d43beb8b6407 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Վիջեթի միջոցով հավելված բացելու համար դուք պետք է հաստատեք ձեր ինքնությունը։ Նաև նկատի ունեցեք, որ ցանկացած ոք կարող է դիտել վիջեթները, նույնիսկ երբ ձեր պլանշետը կողպված է։ Որոշ վիջեթներ կարող են նախատեսված չլինել ձեր կողպէկրանի համար, և այստեղ դրանց ավելացնելը կարող է վտանգավոր լինել։"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Եղավ"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Վիջեթներ"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"«Վիջեթներ» դյուրանցումն ավելացնելու համար համոզվեք, որ «Ցույց տալ վիջեթները կողպէկրանին» պարամետրը միացված է կարգավորումներում։"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Կարգավորումներ"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Անջատել օգտվողին"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"իջնող ընտրացանկ"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Ծանուցումներ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Զրույցներ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ջնջել բոլոր անձայն ծանուցումները"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Բացել ծանուցումների կարգավորումները"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ծանուցումներ չկան}=1{Ծանուցումները դադարեցվել են «{mode}» ռեժիմի կողմից}=2{Ծանուցումները դադարեցվել են «{mode}» ու ևս մի ռեժիմի կողմից}one{Ծանուցումները դադարեցվել են «{mode}» ու ևս # ռեժիմի կողմից}other{Ծանուցումները դադարեցվել են «{mode}» ու ևս # ռեժիմի կողմից}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Սկսել հիմա"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Գլխի շարժումների հետագծում"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Հպեք՝ զանգակի ռեժիմը փոխելու համար"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"զանգակի ռեժիմ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>․ հպեք՝ զանգակի ռեժիմը փոխելու համար"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"անջատել ձայնը"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"միացնել ձայնը"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"միացնել թրթռոցը"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Կողպէկրան"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Ստեղծել նշում"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Բազմախնդրություն"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Տրոհել էկրանը և տեղավորել այս հավելվածը աջում"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Տրոհել էկրանը և տեղավորել այս հավելվածը ձախում"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Տրոհված էկրանից անցնել լիաէկրան ռեժիմ"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Անցեք աջ կողմի կամ ներքևի հավելվածին տրոհված էկրանի միջոցով"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Անցեք աջ կողմի կամ վերևի հավելվածին տրոհված էկրանի միջոցով"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Ստեղնային դյուրանցումներ"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Կարգավորեք ստեղնային դյուրանցումներ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Հեռացնե՞լ դյուրանցումը"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Վերականգնե՞լ կանխադրվածները"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Սեղմեք որևէ ստեղն՝ դյուրանցում նշանակելու համար"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ձեր հատուկ դյուրանցումն ընդմիշտ կջնջվի։"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Բոլոր հատուկ դյուրանցումներն ընդմիշտ կջնջվեն։"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Դյուրանցումների որոնում"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Որոնման արդյունքներ չկան"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ծալել պատկերակը"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Գործողության կամ Meta ստեղնի պատկերակ"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Պլյուս պատկերակ"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Կարգավորել"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Զրոյացնել"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Պատրաստ է"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ծավալել պատկերակը"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"կամ"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Ստեղնաշարի կարգավորումներ"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Ստեղծել դյուրանցում"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Հեռացնել"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Այո, վերականգնել"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Չեղարկել"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Սեղմեք որևէ ստեղն"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ստեղների համակցությունն արդեն օգտագործվում է։ Ընտրեք այլ ստեղն։"</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Սեղմեք գործողության ստեղնը ստեղնաշարի վրա"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Հիանալի՛ է"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Դուք սովորեցիք բոլոր հավելվածները դիտելու ժեստը"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Ուղեցույցի անիմացիա․ սեղմեք՝ նվագարկումը դադարեցնելու/վերսկսելու համար։"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Հետին լուսավորությամբ ստեղնաշար"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d՝ %2$d-ից"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Տան կառավարման տարրեր"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 06ecd11b67e9..095b35bca77a 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Untuk membuka aplikasi menggunakan widget, Anda perlu memverifikasi diri Anda. Selain itu, harap ingat bahwa siapa saja dapat melihatnya, bahkan saat tablet Anda terkunci. Beberapa widget mungkin tidak dirancang untuk layar kunci Anda dan mungkin tidak aman untuk ditambahkan di sini."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Oke"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widget"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Untuk menambahkan pintasan \"Widget\", pastikan \"Tampilkan widget di layar kunci\" diaktifkan di setelan."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Setelan"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Beralih pengguna"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pulldown"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifikasi"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Percakapan"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hapus semua notifikasi senyap"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Buka setelan notifikasi"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikasi dijeda oleh mode Jangan Ganggu"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Tidak ada notifikasi}=1{Notifikasi dijeda oleh {mode}}=2{Notifikasi dijeda oleh {mode} dan satu mode lainnya}other{Notifikasi dijeda oleh {mode} dan # mode lainnya}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Mulai sekarang"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pelacakan Gerak Kepala"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Ketuk untuk mengubah mode pendering"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"mode pendering"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ketuk untuk mengubah mode pendering"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"Tanpa suara"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"aktifkan"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"getar"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci layar"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Buat catatan"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Gunakan layar terpisah dengan aplikasi saat ini di sebelah kanan"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Gunakan layar terpisah dengan aplikasi saat ini di sebelah kiri"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih dari layar terpisah ke layar penuh"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Beralih ke aplikasi di bagian kanan atau bawah saat menggunakan layar terpisah"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Beralih ke aplikasi di bagian kiri atau atas saat menggunakan layar terpisah"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Dalam layar terpisah: ganti salah satu aplikasi dengan yang lain"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Pintasan keyboard"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Menyesuaikan pintasan keyboard"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Hapus pintasan?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset kembali ke pintasan default?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tekan tombol untuk menetapkan pintasan"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Tindakan ini akan menghapus pintasan kustom Anda secara permanen."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tindakan ini akan menghapus semua pintasan kustom Anda secara permanen."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Telusuri pintasan"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Tidak ada hasil penelusuran"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon ciutkan"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikon tombol Tindakan atau Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikon plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Sesuaikan"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Reset"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Selesai"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon luaskan"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Setelan Keyboard"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Setel pintasan"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Hapus"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ya, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Batal"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tekan tombol"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinasi tombol sudah digunakan. Coba tombol lain."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tekan tombol tindakan di keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Oke!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Anda telah menyelesaikan gestur untuk melihat semua aplikasi"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animasi tutorial, klik untuk menjeda dan melanjutkan pemutaran."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Lampu latar keyboard"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tingkat %1$d dari %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrol Rumah"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 4f6ff47a35c7..8a885f0efb77 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Græjur"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Gakktu úr skugga um að kveikt sé á „Sýna græjur á lásskjá“ til að geta bætt flýtileiðinni „Græjur“ við."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Stillingar"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Hnappurinn „Sýna skjávara“"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skipta um notanda"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Fellivalmynd"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Öllum forritum og gögnum í þessari lotu verður eytt."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Tilkynningar"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtöl"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hreinsa allar þöglar tilkynningar"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Opna tilkynningastillingar"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Engar tilkynningar}=1{Hlé gert á tilkynningum þar sem stillt er á {mode}}=2{Hlé gert á tilkynningum þar sem stillt er á {mode} og eina aðra stillingu}one{Hlé gert á tilkynningum þar sem stillt er á {mode} og # aðra stillingu}other{Hlé gert á tilkynningum þar sem stillt er á {mode} og # aðrar stillingar}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Byrja núna"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rakning höfuðhreyfinga"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Ýta til að skipta um hringjarastillingu"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"hringistilling"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ýttu til að skipta um hringjarastillingu"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"þagga"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"hætta að þagga"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"titringur"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lásskjár"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Skrifa glósu"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Fjölvinnsla"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Notaðu skjáskiptingu með núverandi forriti til hægri"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Notaðu skjáskiptingu með núverandi forriti til vinstri"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skipta úr skjáskiptingu yfir á allan skjáinn"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skiptu í forrit til hægri eða fyrir neðan þegar skjáskipting er notuð"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skiptu í forrit til vinstri eða fyrir ofan þegar skjáskipting er notuð"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Í skjáskiptingu: Skipta forriti út fyrir annað forrit"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Tákn lýsilykils (aðgerðarlykils)"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plústákn"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Sérsníða"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Endurstilla"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Lokið"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Stækka tákn"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eða"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Ýttu á aðgerðalykilinn á lyklaborðinu"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Vel gert!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Þú framkvæmdir bendinguna „Sjá öll forrit“"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Leiðsagnarhreyfimynd, smelltu til að gera hlé og halda áfram að spila."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Baklýsing lyklaborðs"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Stig %1$d af %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Heimastýringar"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 76e3360bf88a..790a80dbc543 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widget"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Per aggiungere la scorciatoia \"Widget\", assicurati che l\'opzione \"Mostra widget sulla schermata di blocco\" sia abilitata nelle impostazioni."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Impostazioni"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Pulsante Mostra salvaschermo"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambio utente"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu a discesa"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tutte le app e i dati di questa sessione verranno eliminati."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifiche"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversazioni"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Cancella tutte le notifiche silenziose"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Apri impostazioni di notifica"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifiche messe in pausa in base alla modalità Non disturbare"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nessuna notifica}=1{Notifica messa in pausa da {mode}}=2{Notifiche messe in pausa da {mode} e un\'altra modalità}many{Notifiche messe in pausa da {mode} e # di modalità}other{Notifiche messe in pausa da {mode} e altre # modalità}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Avvia adesso"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rilev. movim. testa"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tocca per cambiare la modalità della suoneria"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modalità suoneria"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, tocca per cambiare la modalità della suoneria"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenzia"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"riattiva l\'audio"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrazione"</string> @@ -873,9 +872,9 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Blocca lo schermo"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Scrivi una nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Utilizza schermo diviso con l\'app corrente a destra"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Utilizza schermo diviso con l\'app corrente a sinistra"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passa da schermo diviso a schermo intero"</string> + <string name="system_multitasking_rhs" msgid="8779289852395243004">"Utilizza lo schermo diviso con l\'app a destra"</string> + <string name="system_multitasking_lhs" msgid="7348595296208696452">"Utilizza lo schermo diviso con l\'app a sinistra"</string> + <string name="system_multitasking_full_screen" msgid="4940465971687159429">"Passa alla modalità a schermo intero"</string> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passa all\'app a destra o sotto mentre usi lo schermo diviso"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passa all\'app a sinistra o sopra mentre usi lo schermo diviso"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string> @@ -1438,8 +1437,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icona tasto Azione o Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Icona Più"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personalizza"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Reimposta"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Fine"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona Espandi"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oppure"</string> @@ -1481,8 +1479,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Premi il tasto azione sulla tastiera"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Ben fatto!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Hai completato il gesto Visualizza tutte le app."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animazione del tutorial: fai clic per mettere in pausa e riprendere la riproduzione."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroilluminazione della tastiera"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Livello %1$d di %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Controlli della casa"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 3257e14bd933..99939a86bc39 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"כדי לפתוח אפליקציה באמצעות ווידג\'ט, עליך לאמת את זהותך. בנוסף, כדאי לזכור שכל אחד יכול לראות את הווידג\'טים גם כשהטאבלט שלך נעול. יכול להיות שחלק מהווידג\'טים לא נועדו למסך הנעילה ושלא בטוח להוסיף אותם לכאן."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"הבנתי"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ווידג\'טים"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"כדי להוסיף את קיצור הדרך \"ווידג\'טים\", צריך לוודא שהאפשרות \"ווידג\'טים במסך הנעילה\" מופעלת בהגדרות."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"הגדרות"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"החלפת משתמש"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"תפריט במשיכה למטה"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"התראות"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ניקוי כל ההתראות השקטות"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"פתיחה של הגדרת ההתראות"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"התראות הושהו על ידי מצב \'נא לא להפריע\'"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{אין התראות}=1{ההתראות הושהו על ידי {mode}}=2{ההתראות הושהו על ידי {mode} ועל ידי מצב אחד נוסף}one{ההתראות הושהו על ידי {mode} ועל ידי # מצבים נוספים}other{ההתראות הושהו על ידי {mode} ועל ידי # מצבים נוספים}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"כן, אפשר להתחיל"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"מעקב ראש"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"יש להקיש כדי לשנות את מצב תוכנת הצלצול"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"מצב תוכנת הצלצול"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, צריך להקיש כדי לשנות את מצב תוכנת הצלצול"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"השתקה"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ביטול ההשתקה"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"רטט"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"נעילת המסך"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"כתיבת הערה"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ריבוי משימות"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"שימוש במסך מפוצל כשהאפליקציה הנוכחית בצד ימין"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"שימוש במסך מפוצל כשהאפליקציה הנוכחית בצד שמאל"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"החלפה ממסך מפוצל למסך מלא"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"מעבר לאפליקציה משמאל או למטה בזמן שימוש במסך מפוצל"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"מעבר לאפליקציה מימין או למעלה בזמן שימוש במסך מפוצל"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"מקשי קיצור"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"התאמה אישית של מקשי הקיצור"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"להסיר את קיצור הדרך?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"לאפס לברירת המחדל?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"צריך להקיש על מקש כדי להקצות מקש קיצור"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"קיצור הדרך יימחק באופן סופי."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"הפעולה הזו תמחק באופן סופי את כל קיצורי הדרך המותאמים אישית."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"קיצורי דרך לחיפוש"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"אין תוצאות חיפוש"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"סמל הכיווץ"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"סמל מקש הפעולה (\"מטא\")"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"סמל הפלוס"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"התאמה אישית"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"איפוס"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"סיום"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"סמל ההרחבה"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"או"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"הגדרות המקלדת"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"הגדרה של מקש קיצור"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"הסרה"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"כן, לאפס"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ביטול"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"יש ללחוץ על מקש"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"שילוב המקשים הזה כבר בשימוש. אפשר לנסות מקש אחר."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"צריך להקיש על מקש הפעולה במקלדת"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"כל הכבוד!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"סיימת לתרגל את התנועה להצגת כל האפליקציות"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"אנימציה של הדרכה, אפשר ללחוץ כדי להשהות ולהמשיך את ההפעלה."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"התאורה האחורית במקלדת"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"רמה %1$d מתוך %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"שליטה במכשירים"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 13dd954fa891..5fd029b25e5c 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ウィジェット"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"[ウィジェット] ショートカットを追加するには、設定で [ロック画面でのウィジェットの表示] が有効になっていることを確認してください。"</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"設定"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"スクリーンセーバー表示ボタン"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ユーザーを切り替える"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"プルダウン メニュー"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"このセッションでのアプリとデータはすべて削除されます。"</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"会話"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"サイレント通知がすべて消去されます"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"通知設定を開く"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"サイレント モードにより通知は一時停止中です"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{通知なし}=1{{mode} により通知は一時停止中です}=2{{mode} と他 1 個のモードにより通知は一時停止中です}other{{mode} と他 # 個のモードにより通知は一時停止中です}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"今すぐ開始"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ヘッド トラッキング"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"タップすると、着信音のモードを変更できます"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"着信音のモード"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>、タップすると、着信音のモードを変更できます"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ミュート"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ミュートを解除"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"バイブレーション"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"画面をロック"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"メモを入力する"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"マルチタスク"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"分割画面の使用(現在のアプリを右側に表示)"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"分割画面の使用(現在のアプリを左側に表示)"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"分割画面から全画面に切り替える"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"分割画面の使用時に右側または下部のアプリに切り替える"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"分割画面の使用時に左側または上部のアプリに切り替える"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"分割画面中: アプリを順に置換する"</string> @@ -1480,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"キーボードのアクションキーを押します"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"完了です!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"「すべてのアプリを表示する」ジェスチャーを学習しました"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"チュートリアルのアニメーションです。クリックすると一時停止、もう一度クリックすると再開します。"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"キーボード バックライト"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"レベル %1$d/%2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ホーム コントロール"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 9390bd22e1a7..55d38c9ead8e 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ვიჯეტები"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"„ვიჯეტების“ მალსახმობის დასამატებლად დარწმუნდით, რომ პარამეტრებში ჩართულია „დაბლოკილ ეკრანზე ვიჯეტების ჩვენება“."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"პარამეტრები"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"ეკრანმზოგის ღილაკის ჩვენება"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"მომხმარებლის გადართვა"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ჩამოშლადი მენიუ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ამ სესიის ყველა აპი და მონაცემი წაიშლება."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"შეტყობინებები"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"საუბრები"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ყველა ჩუმი შეტყობინების გასუფთავება"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"შეტყობინების პარამეტრების გახსნა"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{შეტყობინებები არ არის}=1{შეტყობინებები შეჩერებულია {mode}-ის გამო}=2{შეტყობინებები შეჩერებულია {mode}-ის და ერთი სხვა რეჟიმის გამო}other{შეტყობინებები შეჩერებულია {mode}-ის და # სხვა რეჟიმის გამო}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"დაწყება ახლავე"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ხმის მიდევნებით"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"შეეხეთ მრეკავის რეჟიმის შესაცვლელად"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"მრეკავის რეჟიმი"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, შეეხეთ მრეკავის რეჟიმის შესაცვლელად"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"დადუმება"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"დადუმების მოხსნა"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ვიბრაცია"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ჩაკეტილი ეკრანი"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"ჩაინიშნეთ"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"მრავალამოცანიანი რეჟიმი"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ეკრანის გაყოფის გამოყენება მიმდინარე აპზე მარჯვნივ"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ეკრანის გაყოფის გამოყენება მიმდინარე აპზე მარცხნივ"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"გადართვა ეკრანის გაყოფიდან სრულ ეკრანზე"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ეკრანის გაყოფის გამოყენებისას აპზე მარჯვნივ ან ქვემოთ გადართვა"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ეკრანის გაყოფის გამოყენებისას აპზე მარცხნივ ან ზემოთ გადართვა"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"მოქმედების ან მეტა კლავიშის ხატულა"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"პლუსის ხატულა"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"მორგება"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"გადაყენება"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"მზადაა"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ხატულის გაფართოება"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ან"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"დააჭირეთ მოქმედების კლავიშს თქვენს კლავიატურაზე"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ყოჩაღ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"თქვენ დაასრულეთ ყველა აპის ნახვის ჟესტი"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"სახელმძღვანელო ანიმაცია, დააწკაპუნეთ დასაპაუზებლად და გასაგრძელებლად."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"კლავიატურის შენათება"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"დონე: %1$d %2$d-დან"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"სახლის კონტროლი"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 672bb66dd15d..9b6dc953de12 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Виджеттер"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"Виджеттер\" таңбашасын қосу үшін параметрлерде \"Виджеттерді құлыптаулы экранда көрсету\" опциясының қосулы екенін тексеріңіз."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Параметрлер"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Пайдаланушыны ауыстыру"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ашылмалы мәзір"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Осы сеанстағы барлық қолданба мен дерек жойылады."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Хабарландырулар"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Әңгімелер"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Барлық үнсіз хабарландыруларды өшіру"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Хабарландыру параметрлерін ашу"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Хабарландырулар Мазаламау режимінде кідіртілді"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Хабарландырулар жоқ.}=1{Хабарландыруларды {mode} режимі кідіртті.}=2{Хабарландыруларды {mode} және тағы бір режим кідіртті.}other{Хабарландыруларды {mode} және тағы # режим кідіртті.}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Қазір бастау"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Бас қимылын қадағалау"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Қоңырау режимін өзгерту үшін түртіңіз."</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"қоңырау режимі"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, қоңырау режимін өзгерту үшін түртіңіз."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"дыбысын өшіру"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"дыбысын қосу"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"дірілдету"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды құлыптау"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Ескертпе жазу"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Мультитаскинг"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Қолданбаны бөлінген экранның оң жағынан пайдалану"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Қолданбаны бөлінген экранның сол жағынан пайдалану"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Бөлінген экран режимінен толық экран режиміне ауысу"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Бөлінген экранда оң не төмен жақтағы қолданбаға ауысу"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Бөлінген экранда сол не жоғары жақтағы қолданбаға ауысу"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлу кезінде: бір қолданбаны басқасымен алмастыру"</string> @@ -1480,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Пернетақтадағы әрекет пернесін басыңыз."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Жарайсыз!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Барлық қолданбаны көру қимылын орындадыңыз."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Оқулықтың анимациясы, ойнатуды кідірту және жалғастыру үшін басыңыз."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Пернетақта жарығы"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Деңгей: %1$d/%2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Үй басқару элементтері"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 96a9ed478908..50f5fa05aff5 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ធាតុក្រាហ្វិក"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"ដើម្បីបញ្ចូលផ្លូវកាត់ \"ធាតុក្រាហ្វិក\" ត្រូវប្រាកដថា \"បង្ហាញធាតុក្រាហ្វិកនៅលើអេក្រង់ចាក់សោ\" ត្រូវបានបើកនៅក្នុងការកំណត់។"</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ការកំណត់"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"បង្ហាញប៊ូតុងធាតុរក្សាអេក្រង់"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ប្ដូរអ្នកប្រើ"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ម៉ឺនុយទាញចុះ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"កម្មវិធី និងទិន្នន័យទាំងអស់ក្នុងវគ្គនេះនឹងត្រូវលុប។"</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"ការជូនដំណឹង"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ការសន្ទនា"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"សម្អាតការជូនដំណឹងស្ងាត់ទាំងអស់"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"បើកការកំណត់ការជូនដំណឹង"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ការជូនដំណឹងបានផ្អាកដោយមុខងារកុំរំខាន"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{គ្មានការជូនដំណឹង}=1{ការជូនដំណឹងត្រូវបានផ្អាកដោយ {mode}}=2{ការជូនដំណឹងត្រូវបានផ្អាកដោយ {mode} និងមុខងារមួយផ្សេងទៀត}other{ការជូនដំណឹងត្រូវបានផ្អាកដោយ {mode} និងមុខងារ # ផ្សេងទៀត}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ចាប់ផ្ដើមឥឡូវ"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"រេតាមក្បាល"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ចុចដើម្បីប្ដូរមុខងាររោទ៍"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"មុខងារកម្មវិធីរោទ៍"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g> ចុចដើម្បីប្ដូរមុខងារកម្មវិធីរោទ៍"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"បិទសំឡេង"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"បើកសំឡេង"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ញ័រ"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ចាក់សោអេក្រង់"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"កត់ចំណាំ"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ការដំណើរការបានច្រើន"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ប្រើមុខងារបំបែកអេក្រង់ជាមួយកម្មវិធីបច្ចុប្បន្ននៅខាងស្ដាំ"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ប្រើមុខងារបំបែកអេក្រង់ជាមួយកម្មវិធីបច្ចុប្បន្ននៅខាងឆ្វេង"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"ប្ដូរពីមុខងារបំបែកអេក្រង់ទៅជាអេក្រង់ពេញ"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ប្ដូរទៅកម្មវិធីនៅខាងស្ដាំ ឬខាងក្រោម ពេលកំពុងប្រើមុខងារបំបែកអេក្រង់"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ប្ដូរទៅកម្មវិធីនៅខាងឆ្វេង ឬខាងលើ ពេលកំពុងប្រើមុខងារបំបែកអេក្រង់"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"ក្នុងអំឡុងពេលប្រើមុខងារបំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីមួយទៅមួយទៀត"</string> @@ -1421,7 +1423,7 @@ <string name="shortcut_helper_category_system_apps" msgid="6001757545472556810">"កម្មវិធីប្រព័ន្ធ"</string> <string name="shortcut_helper_category_multitasking" msgid="7413381961404090136">"ការធ្វើកិច្ចការច្រើន"</string> <string name="shortcutHelper_category_split_screen" msgid="1159669813444812244">"មុខងារបំបែកអេក្រង់"</string> - <string name="shortcut_helper_category_input" msgid="8674018654124839566">"ធាតុចូល"</string> + <string name="shortcut_helper_category_input" msgid="8674018654124839566">"វិធីបញ្ចូល"</string> <string name="shortcut_helper_category_app_shortcuts" msgid="8010249408308587117">"ផ្លូវកាត់កម្មវិធី"</string> <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"កម្មវិធីបច្ចុប្បន្ន"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"ភាពងាយស្រួល"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"រូបគ្រាប់ចុចសកម្មភាព ឬមេតា"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"រូបសញ្ញាបូក"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"ប្ដូរតាមបំណង"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"កំណត់ឡើងវិញ"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"រួចរាល់"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"រូបតំណាង \"ពង្រីក\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ឬ"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ចុចគ្រាប់ចុចសកម្មភាពលើក្ដារចុចរបស់អ្នក"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ធ្វើបានល្អ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"អ្នកបានបញ្ចប់ចលនាមើលកម្មវិធីទាំងអស់ហើយ"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"រូបមានចលនាក្នុងអំឡុងមេរៀន ចុចដើម្បីផ្អាក រួចបន្តការចាក់ឡើងវិញ។"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ពន្លឺក្រោយក្ដារចុច"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"កម្រិតទី %1$d នៃ %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ការគ្រប់គ្រងផ្ទះ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 89b8db2819c4..a3718d3ffa96 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ವಿಜೆಟ್ಗಳು"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"ವಿಜೆಟ್ಗಳು\" ಶಾರ್ಟ್ಕಟ್ ಸೇರಿಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ \"ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ವಿಜೆಟ್ಗಳನ್ನು ತೋರಿಸಿ\" ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"ಸ್ಕ್ರೀನ್ಸೇವರ್ ಬಟನ್ ತೋರಿಸಿ"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ಪುಲ್ಡೌನ್ ಮೆನು"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ಈ ಸೆಶನ್ನಲ್ಲಿನ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ಸಂಭಾಷಣೆಗಳು"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ಎಲ್ಲಾ ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"ನೋಟಿಫಿಕೇಶನ್ಗಳ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ಯಾವುದೇ ನೋಟಿಫಿಕೇಶನ್ಗಳು ಇಲ್ಲ}=1{ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು {mode} ವಿರಾಮಗೊಳಿಸಿದೆ}=2{ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು {mode} ಹಾಗೂ ಇತರ ಒಂದು ಮೋಡ್ ವಿರಾಮಗೊಳಿಸಿವೆ}one{ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು {mode} ಹಾಗೂ ಇತರ # ಮೋಡ್ಗಳು ವಿರಾಮಗೊಳಿಸಿವೆ}other{ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು {mode} ಹಾಗೂ ಇತರ # ಮೋಡ್ಗಳು ವಿರಾಮಗೊಳಿಸಿವೆ}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ಹೆಡ್ ಟ್ರ್ಯಾಕಿಂಗ್"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ರಿಂಗರ್ ಮೋಡ್ ಬದಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ರಿಂಗರ್ ಮೋಡ್"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ರಿಂಗರ್ ಮೋಡ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ಮ್ಯೂಟ್ ಮಾಡಿ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ಅನ್ಮ್ಯೂಟ್ ಮಾಡಿ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ವೈಬ್ರೇಟ್"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಮಾಡಿ"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"ಟಿಪ್ಪಣಿಯನ್ನು ತೆಗೆದುಕೊಳ್ಳಿ"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ಮಲ್ಟಿಟಾಸ್ಕಿಂಗ್"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ಬಲಭಾಗದಲ್ಲಿ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಮೂಲಕ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಬಳಸಿ"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ಎಡಭಾಗದಲ್ಲಿ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಮೂಲಕ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಬಳಸಿ"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ನಿಂದ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ಗೆ ಬದಲಿಸಿ"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಬಲಭಾಗ ಅಥವಾ ಕೆಳಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಎಡಭಾಗ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"</string> @@ -1480,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಆ್ಯಕ್ಷನ್ ಕೀಯನ್ನು ಒತ್ತಿ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ಭೇಷ್!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ನೀವು ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳ ಜೆಸ್ಚರ್ ವೀಕ್ಷಣೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ಟ್ಯುಟೋರಿಯಲ್ ಅನಿಮೇಷನ್, ವಿರಾಮಗೊಳಿಸಲು ಮತ್ತು ಪ್ಲೇ ಪುನರಾರಂಭಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ಕೀಬೋರ್ಡ್ ಬ್ಯಾಕ್ಲೈಟ್"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ರಲ್ಲಿ %1$d ಮಟ್ಟ"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ಮನೆ ನಿಯಂತ್ರಣಗಳು"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 276d70801cd4..ee19ad2c5af2 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"위젯"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\'위젯\' 바로가기를 추가하려면 설정에서 \'잠금 화면에 위젯 표시\'가 사용 설정되어 있어야 합니다."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"설정"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"사용자 전환"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"풀다운 메뉴"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"이 세션에 있는 모든 앱과 데이터가 삭제됩니다."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"알림"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"대화"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"무음 알림 모두 삭제"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"알림 설정 열기"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 알림이 일시중지됨"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{알림 없음}=1{{mode} 모드로 인해 알림이 일시중지되었습니다.}=2{{mode} 및 다른 모드로 인해 알림이 일시중지되었습니다.}other{{mode} 및 다른 모드 #개로 인해 알림이 일시중지되었습니다.}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"시작하기"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"머리 추적"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"탭하여 벨소리 장치 모드 변경"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"벨소리 장치 모드"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, 탭하여 벨소리 장치 모드 변경"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"음소거"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"음소거 해제"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"진동"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"잠금 화면"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"메모 작성"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"멀티태스킹"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"현재 앱이 오른쪽에 오도록 화면 분할 사용"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"현재 앱이 왼쪽에 오도록 화면 분할 사용"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"화면 분할에서 전체 화면으로 전환"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"화면 분할을 사용하는 중에 오른쪽 또는 아래쪽에 있는 앱으로 전환"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"화면 분할을 사용하는 중에 왼쪽 또는 위쪽에 있는 앱으로 전환하기"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"화면 분할 중: 다른 앱으로 바꾸기"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"작업 또는 메타 키 아이콘"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"더하기 아이콘"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"맞춤설정"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"재설정"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"완료"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"확장 아이콘"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"또는"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"키보드의 작업 키를 누르세요."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"잘하셨습니다"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"모든 앱 보기 동작을 완료했습니다."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"튜토리얼 애니메이션입니다. 일시중지하고 재생을 재개하려면 클릭하세요."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"키보드 백라이트"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d단계 중 %1$d단계"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"홈 컨트롤"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index ab20a7bd054f..7ebfdec49c30 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Виджеттер"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"Виджеттер\" ыкчам баскычын кошуу үчүн параметрлерге өтүп, \"Виджеттерди кулпуланган экранда көрсөтүү\" параметри иштетилгенин текшериңиз."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Параметрлер"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Колдонуучуну которуу"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ылдый түшүүчү меню"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Бул сеанстагы бардык колдонмолор жана аларга байланыштуу нерселер өчүрүлөт."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Билдирмелер"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Сүйлөшүүлөр"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бардык үнсүз билдирмелерди өчүрүү"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Билдирмелердин параметрлерин ачуу"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"Тынчымды алба\" режиминде билдирмелер тындырылды"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Билдирмелер жок}=1{{mode} режими билдирмелерди тындырды}=2{{mode} жана дагы бир режим билдирмелерди тындырды}other{{mode} жана дагы # режим билдирмелерди тындырды}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Азыр баштоо"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Баштын кыймылына көз салуу"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Коңгуроо режимин өзгөртүү үчүн басыңыз"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"коңгуроо режими"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, коңгуроо режимин өзгөртүү үчүн басыңыз"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"үнсүз"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"үнүн чыгаруу"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"дирилдөө"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды кулпулоо"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Кыска жазуу түзүү"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Бир нече тапшырма аткаруу"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Учурдагы колдонмону оңго жылдырып, экранды бөлүү"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Учурдагы колдонмону солго жылдырып, экранды бөлүү"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Экранды бөлүү режиминен толук экранга которулуу"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Бөлүнгөн экранда сол же төмөн жактагы колдонмого которулуу"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Бөлүнгөн экранды колдонуп жатканда сол же жогору жактагы колдонмого которулуңуз"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Аракет же Мета ачкыч сүрөтчөсү"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Кошуу сүрөтчөсү"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Ыңгайлаштыруу"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Баштапкы абалга келтирүү"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Бүттү"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жайып көрсөтүү сүрөтчөсү"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"же"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Баскычтобуңуздагы аракет баскычын басыңыз"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Эң жакшы!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Бардык колдонмолорду көрүү жаңсоосун аткардыңыз"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Үйрөткүч анимация, ойнотууну тындыруу же улантуу үчүн чыкылдатыңыз."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Баскычтоптун жарыгы"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ичинен %1$d-деңгээл"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Үйдөгү түзмөктөрдү тескөө"</string> diff --git a/packages/SystemUI/res/values-land/styles.xml b/packages/SystemUI/res/values-land/styles.xml index 73812c965a17..ae0006fbbf73 100644 --- a/packages/SystemUI/res/values-land/styles.xml +++ b/packages/SystemUI/res/values-land/styles.xml @@ -43,21 +43,21 @@ <item name="android:layout_marginTop">6dp</item> <item name="android:textSize">36dp</item> <item name="android:focusable">true</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Subtitle"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">6dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Description"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">6dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index a3a25e850e52..151687fd4050 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"ເພື່ອເປີດແອັບໂດຍໃຊ້ວິດເຈັດ, ທ່ານຈະຕ້ອງຢັ້ງຢືນວ່າແມ່ນທ່ານ. ນອກຈາກນັ້ນ, ກະລຸນາຮັບຊາບວ່າທຸກຄົນສາມາດເບິ່ງຂໍ້ມູນດັ່ງກ່າວໄດ້, ເຖິງແມ່ນວ່າແທັບເລັດຂອງທ່ານຈະລັອກຢູ່ກໍຕາມ. ວິດເຈັດບາງຢ່າງອາດບໍ່ໄດ້ມີໄວ້ສຳລັບໜ້າຈໍລັອກຂອງທ່ານ ແລະ ອາດບໍ່ປອດໄພທີ່ຈະເພີ່ມໃສ່ບ່ອນນີ້."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"ເຂົ້າໃຈແລ້ວ"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ວິດເຈັດ"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"ເພື່ອເພີ່ມທາງລັດ \"ວິດເຈັດ\", ກະລຸນາກວດສອບວ່າໄດ້ເປີດການນຳໃຊ້ \"ສະແດງວິດເຈັດຢູ່ໜ້າຈໍລັອກ\" ໃນການຕັ້ງຄ່າແລ້ວ."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ການຕັ້ງຄ່າ"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"ປຸ່ມສະແດງພາບພັກໜ້າຈໍ"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ສະຫຼັບຜູ້ໃຊ້"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ເມນູແບບດຶງລົງ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ແອັບຯແລະຂໍ້ມູນທັງໝົດໃນເຊດຊັນນີ້ຈະຖືກລຶບອອກ."</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"ການແຈ້ງເຕືອນ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ການສົນທະນາ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ລຶບລ້າງການແຈ້ງເຕືອນແບບງຽບທັງໝົດ"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"ເປີດການຕັ້ງຄ່າການແຈ້ງເຕືອນ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ຢຸດການແຈ້ງເຕືອນໂດຍໂໝດຫ້າມລົບກວນແລ້ວ"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ບໍ່ມີການແຈ້ງເຕືອນ}=1{{mode} ຢຸດການແຈ້ງເຕືອນໄວ້ຊົ່ວຄາວ}=2{{mode} ແລະ ອີກ 1 ໂໝດຢຸດການແຈ້ງເຕືອນໄວ້ຊົ່ວຄາວ}other{{mode} ແລະ ອີກ # ໂໝດຢຸດການແຈ້ງເຕືອນໄວ້ຊົ່ວຄາວ}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ເລີ່ມດຽວນີ້"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ການຕິດຕາມຫົວ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ແຕະເພື່ອປ່ຽນໂໝດຣິງເກີ"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ໂໝດຣິງເກີ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ແຕະເພື່ອປ່ຽນໂໝດຣິງເກີ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ປິດສຽງ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ເຊົາປິດສຽງ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ສັ່ນເຕືອນ"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ໜ້າຈໍລັອກ"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"ຈົດບັນທຶກ"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ການເຮັດຫຼາຍໜ້າວຽກພ້ອມກັນ"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ໃຊ້ການແບ່ງໜ້າຈໍກັບແອັບປັດຈຸບັນຢູ່ເບື້ອງຂວາ"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ໃຊ້ການແບ່ງໜ້າຈໍກັບແອັບປັດຈຸບັນຢູ່ເບື້ອງຊ້າຍ"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"ສະຫຼັບຈາກແບ່ງໜ້າຈໍໄປເປັນເຕັມຈໍ"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຂວາ ຫຼື ທາງລຸ່ມໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຊ້າຍ ຫຼື ທາງເທິງໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ໃຫ້ປ່ຽນຈາກແອັບໜຶ່ງເປັນອີກແອັບໜຶ່ງ"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"ຄີລັດ"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"ປັບແຕ່ງຄີລັດ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ລຶບທາງລັດອອກບໍ?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ຣີເຊັດກັບຄືນເປັນຄ່າເລີ່ມຕົ້ນບໍ?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ກົດປຸ່ມເພື່ອກຳນົດທາງລັດ"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ການດຳເນີນການນີ້ຈະລຶບທາງລັດທີ່ກຳນົດເອງຂອງທ່ານຢ່າງຖາວອນ."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ການດຳເນີນການນີ້ຈະລຶບທາງລັດທີ່ກຳນົດເອງທັງໝົດຂອງທ່ານຢ່າງຖາວອນ."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ທາງລັດການຊອກຫາ"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"ບໍ່ມີຜົນການຊອກຫາ"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ໄອຄອນຫຍໍ້ລົງ"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ໄອຄອນຄຳສັ່ງ ຫຼື ປຸ່ມ Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"ໄອຄອນໝາຍບວກ"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"ປັບແຕ່ງ"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"ຣີເຊັດ"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"ແລ້ວໆ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ໄອຄອນຂະຫຍາຍ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ຫຼື"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"ການຕັ້ງຄ່າແປ້ນພິມ"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"ຕັ້ງທາງລັດ"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"ລຶບອອກ"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ແມ່ນ, ຣີເຊັດ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ຍົກເລີກ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ກົດປຸ່ມ"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ນໍາໃຊ້ປຸ່ມປະສົມຢູ່ແລ້ວ. ໃຫ້ລອງປຸ່ມອື່ນ."</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ກົດປຸ່ມຄຳສັ່ງຢູ່ແປ້ນພິມຂອງທ່ານ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ດີຫຼາຍ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ທ່ານເບິ່ງທ່າທາງຂອງແອັບທັງໝົດສຳເລັດແລ້ວ"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ພາບເຄື່ອນໄຫວຂອງບົດສອນການນຳໃຊ້, ຄລິກເພື່ອຢຸດຊົ່ວຄາວ ແລະ ສືບຕໍ່ຫຼິ້ນ."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ໄຟປຸ່ມແປ້ນພິມ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"ລະດັບທີ %1$d ຈາກ %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ການຄວບຄຸມເຮືອນ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index cba0db1a4e05..91e17a71eaa3 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Kad galėtumėte atidaryti programą naudodami valdiklį, turėsite patvirtinti savo tapatybę. Be to, atminkite, kad bet kas gali peržiūrėti valdiklius net tada, kai planšetinis kompiuteris užrakintas. Kai kurie valdikliai gali būti neskirti jūsų užrakinimo ekranui ir gali būti nesaugu juos čia pridėti."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Supratau"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Valdikliai"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Jei norite pridėti valdiklių šaukinį, patikrinkite, ar nustatymuose įgalinta parinktis „Rodyti valdiklius užrakinimo ekrane“."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Nustatymai"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Mygtukas „Rodyti ekrano užsklandą“"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Perjungti naudotoją"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"išplečiamasis meniu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bus ištrintos visos šios sesijos programos ir duomenys."</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Pranešimai"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Pokalbiai"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Išvalyti visus tylius pranešimus"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Atidaryti pranešimų nustatymus"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pranešimai pristabdyti naudojant netrukdymo režimą"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nėra pranešimų}=1{Pranešimai pristabdyti naudojant režimą „{mode}“}=2{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar vieną režimą}one{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimą}few{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimus}many{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimo}other{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimų}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Pradėti dabar"</string> @@ -874,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Užrakinti ekraną"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Sukurti pastabą"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Kelių užduočių atlikimas"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Naudoti išskaidyto ekrano režimą su dabartine programa dešinėje"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Naudoti išskaidyto ekrano režimą su dabartine programa kairėje"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Perjungti iš išskaidyto ekrano režimo į viso ekrano režimą"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Perjunkite į programą dešinėje arba apačioje išskaidyto ekrano režimu"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Perjunkite į programą kairėje arba viršuje išskaidyto ekrano režimu"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"</string> @@ -1429,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Spartieji klavišai"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Sparčiųjų klavišų tinkinimas"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Pašalinti spartųjį klavišą?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Iš naujo nustatyti numatytąjį nustatymą?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Paspauskite klavišą, kad priskirtumėte spartųjį klavišą"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Bus visam laikui ištrintas tinkintas spartusis klavišas."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Bus visam laikui ištrinti visi tinkinti šaukiniai."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Ieškoti sparčiųjų klavišų"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Nėra jokių paieškos rezultatų"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sutraukimo piktograma"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Veiksmo arba metaduomenų klavišo piktograma"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Pliuso piktograma"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Tinkinti"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Nustatyti iš naujo"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Atlikta"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Išskleidimo piktograma"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"arba"</string> @@ -1452,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Klaviatūros nustatymai"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Nustatyti spartųjį klavišą"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Pašalinti"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Taip, nustatyti iš naujo"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Atšaukti"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Paspauskite klavišą"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Klavišų derinys jau naudojamas. Bandykite naudoti kitą klavišą."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 76980088c428..c06c2bad6bbc 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Lai atvērtu lietotni, izmantojot logrīku, jums būs jāapstiprina sava identitāte. Turklāt ņemiet vērā, ka ikviens var skatīt logrīkus, pat ja planšetdators ir bloķēts. Iespējams, daži logrīki nav paredzēti izmantošanai bloķēšanas ekrānā, un var nebūt droši tos šeit pievienot."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Labi"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Logrīki"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Lai pievienotu saīsni “Logrīki”, iestatījumos noteikti iespējojiet opciju “Rādīt logrīkus bloķēšanas ekrānā”."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Iestatījumi"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mainīt lietotāju"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"novelkamā izvēlne"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Paziņojumi"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Sarunas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Notīrīt visus klusos paziņojumus"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Atvērt paziņojumu iestatījumus"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nav paziņojumu}=1{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” dēļ}=2{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl viena režīma dēļ}zero{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl # režīmu dēļ}one{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl # režīma dēļ}other{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl # režīmu dēļ}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Sākt tūlīt"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seko galvai"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Pieskarieties, lai mainītu zvanītāja režīmu."</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"zvanītāja režīms"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>; pieskarieties, lai mainītu zvanītāja režīmu"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"izslēgt skaņu"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ieslēgt skaņu"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrēt"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Bloķēt ekrānu"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Izveidot piezīmi"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Vairākuzdevumu režīms"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Izmantot ekrāna sadalīšanu ar pašreizējo lietotni labajā pusē"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Izmantot ekrāna sadalīšanu ar pašreizējo lietotni kreisajā pusē"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pārslēgties no ekrāna sadalīšanas režīma uz pilnekrāna režīmu"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pāriet uz lietotni pa labi/lejā, kamēr izmantojat sadalīto ekrānu."</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pāriet uz lietotni pa kreisi/augšā, kamēr izmantojat sadalīto ekrānu."</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena ekrāna uz otru"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Īsinājumtaustiņi"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Īsinājumtaustiņu pielāgošana"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Vai noņemt saīsni?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vai atiestatīt noklusējuma vērtības?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Lai piešķirtu īsinājumtaustiņu, nospiediet taustiņu"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Veicot šo darbību, jūsu pielāgotā saīsne tiks neatgriezeniski izdzēsta."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Veicot šo darbību, visas jūsu pielāgotās saīsnes tiks neatgriezeniski dzēstas."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Meklēt saīsnes"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Nav meklēšanas rezultātu"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sakļaušanas ikona"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Darbību jeb meta taustiņa ikona"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Pluszīmes ikona"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Pielāgot"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Atiestatīt"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Gatavs"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Izvēršanas ikona"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vai"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Tastatūras iestatījumi"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Iestatīt īsinājumtaustiņu"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Noņemt"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Jā, atiestatīt"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Atcelt"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Nospiediet taustiņu"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Taustiņu kombinācija jau tiek izmantota. Izmēģiniet citu taustiņu."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tastatūrā nospiediet darbību taustiņu."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Lieliski!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Jūs sekmīgi veicāt visu lietotņu skatīšanas žestu."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Mācību animācija. Noklikšķiniet, lai pārtrauktu un atsāktu atskaņošanu."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastatūras fona apgaismojums"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Līmenis numur %1$d, kopā ir %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Mājas kontrolierīces"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 783e52ef01d9..a1e6017b0b84 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"За да отворите апликација со помош на виџет, ќе треба да потврдите дека сте вие. Покрај тоа, имајте предвид дека секој може да ги гледа виџетите, дури и кога вашиот таблет е заклучен. Некои виџети можеби не се наменети за вашиот заклучен екран, па можеби не е безбедно да се додадат овде."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Сфатив"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Виџети"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"За да ја додадете кратенката „Виџети“, погрижете се да биде овозможен „Прикажување виџети на заклучен екран“ во „Поставки“."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Поставки"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"паѓачко мени"</string> @@ -709,8 +709,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Следење на главата"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Допрете за да го промените режимот на ѕвончето"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"режим на ѕвонче"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, допрете за да го промените режимот на ѕвончето"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"исклучен звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"вклучен звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вибрации"</string> @@ -875,9 +874,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Заклучете го екранот"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Фатете белешка"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Мултитаскинг"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Користете поделен екран со тековната апликација оддесно"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Користете поделен екран со тековната апликација одлево"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Префрлете се од поделен екран на цел екран"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Префрлете се на апликацијата десно или долу при користењето поделен екран"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Префрлете се на апликацијата лево или горе при користењето поделен екран"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"При поделен екран: префрлете ги аплик. од едната на другата страна"</string> @@ -887,8 +889,8 @@ <string name="system_desktop_mode_toggle_maximize_window" msgid="4084100093691768239">"Максимизирај го прозорецот"</string> <string name="system_desktop_mode_minimize_window" msgid="1248714536732927092">"Минимизирај го прозорецот"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Внесување"</string> - <string name="input_switch_input_language_next" msgid="3782155659868227855">"Префрлете на следниот јазик"</string> - <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Префрлете на претходниот јазик"</string> + <string name="input_switch_input_language_next" msgid="3782155659868227855">"Префрлете се на следниот јазик"</string> + <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Префрлете се на претходниот јазик"</string> <string name="input_access_emoji" msgid="8105642858900406351">"Пристапете до емоџијата"</string> <string name="input_access_voice_typing" msgid="7291201476395326141">"Пристапете до гласовното пишување"</string> <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Апликации"</string> @@ -1430,20 +1432,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Кратенки од тастатура"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Приспособете ги кратенките од тастатурата"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Да се отстрани кратенката?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Да се ресетира на стандардните поставки?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Притиснете го копчето за да доделите кратенка"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ова ќе ја избрише вашата приспособена кратенка трајно."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Ова ќе ги избрише трајно сите ваши приспособени кратенки."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Пребарувајте кратенки"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Нема резултати од пребарување"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за собирање"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Икона за дејство или копче за дејство"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Икона плус"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Приспособете"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Ресетирај"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Готово"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширување"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> @@ -1453,8 +1452,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Поставки за тастатурата"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Поставете кратенка"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Отстрани"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Да, ресетирај"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Откажи"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Притиснете го копчето"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Комбинацијата на копчиња веќе се користи. Обидете се со друго копче."</string> @@ -1486,8 +1484,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Притиснете го копчето за дејство на тастатурата"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Браво!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Го завршивте движењето за прегледување на сите апликации"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимација за упатство, кликнете за ја паузирате и да ја продолжите репродукцијата."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Осветлување на тастатура"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ниво %1$d од %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Контроли за домот"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 31348724b9d2..4dc40f834449 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"വിജറ്റുകൾ"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"വിജറ്റുകൾ\" കുറുക്കുവഴി ചേർക്കാൻ, ക്രമീകരണത്തിൽ \"ലോക്ക് സ്ക്രീനിൽ വിജറ്റുകൾ കാണിക്കുക\" പ്രവർത്തനക്ഷമമാക്കിയെന്ന് ഉറപ്പാക്കുക."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ക്രമീകരണം"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"സ്ക്രീൻ സേവർ ബട്ടൺ കാണിക്കുക"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ഉപയോക്താവ് മാറുക"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"പുൾഡൗൺ മെനു"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ഈ സെഷനിലെ എല്ലാ ആപ്പുകളും ഡാറ്റയും ഇല്ലാതാക്കും."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"അറിയിപ്പുകൾ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"സംഭാഷണങ്ങൾ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"എല്ലാ നിശബ്ദ അറിയിപ്പുകളും മായ്ക്കുക"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"അറിയിപ്പ് ക്രമീകരണം തുറക്കുക"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{അറിയിപ്പുകൾ ഒന്നുമില്ല}=1{{mode}, അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തിയിരിക്കുന്നു}=2{{mode} എന്നതും മറ്റൊരു മോഡും, അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തിയിരിക്കുന്നു}other{{mode} എന്നതും മറ്റ് # മോഡുകളും, അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തിയിരിക്കുന്നു}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ഇപ്പോൾ ആരംഭിക്കുക"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ഹെഡ് ട്രാക്കിംഗ്"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"റിംഗർ മോഡ് മാറ്റാൻ ടാപ്പ് ചെയ്യുക"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"റിംഗർ മോഡ്"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, റിംഗർ മോഡ് മാറ്റാൻ ടാപ്പ് ചെയ്യുക"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"മ്യൂട്ട് ചെയ്യുക"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"അൺമ്യൂട്ട് ചെയ്യുക"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"വൈബ്രേറ്റ് ചെയ്യുക"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ലോക്ക് സ്ക്രീൻ"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"ഒരു കുറിപ്പെടുക്കുക"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"മൾട്ടിടാസ്കിംഗ്"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"വലതുവശത്തുള്ള നിലവിലെ ആപ്പിനൊപ്പം സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുക"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ഇടതുവശത്തുള്ള നിലവിലെ ആപ്പിനൊപ്പം സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുക"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"സ്ക്രീൻ വിഭജന മോഡിൽ നിന്ന് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ വലതുവശത്തെ/താഴത്തെ ആപ്പിലേക്ക് മാറുക"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ ഇടതുവശത്തെ/മുകളിലെ ആപ്പിലേക്ക് മാറൂ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"സ്ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ആക്ഷൻ/മെറ്റാ കീ ഐക്കൺ"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"പ്ലസ് ഐക്കൺ"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"ഇഷ്ടാനുസൃതമാക്കുക"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"റീസെറ്റ് ചെയ്യുക"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"പൂർത്തിയായി"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"വികസിപ്പിക്കൽ ഐക്കൺ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"അല്ലെങ്കിൽ"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"നിങ്ങളുടെ കീബോർഡിലെ ആക്ഷൻ കീ അമർത്തുക"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"അഭിനന്ദനങ്ങൾ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"\'എല്ലാ ആപ്പുകളും കാണുക\' ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ട്യൂട്ടോറിയൽ ആനിമേഷൻ, താൽക്കാലികമായി നിർത്താനും പ്ലേ പുനരാരംഭിക്കാനും ക്ലിക്ക് ചെയ്യുക."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"കീബോഡ് ബാക്ക്ലൈറ്റ്"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-ൽ %1$d-ാമത്തെ ലെവൽ"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ഹോം കൺട്രോളുകൾ"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 42182bf3120e..13436343e0c4 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Виджет ашиглан аппыг нээхийн тулд та өөрийгөө мөн болохыг баталгаажуулах шаардлагатай болно. Мөн таны таблет түгжээтэй байсан ч тэдгээрийг дурын хүн үзэж болохыг санаарай. Зарим виджет таны түгжээтэй дэлгэцэд зориулагдаагүй байж магадгүй ба энд нэмэхэд аюултай байж болзошгүй."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Ойлголоо"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Виджет"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"Виджет\"-ийн товчлол нэмэхийн тулд \"Түгжээтэй дэлгэц дээр виджет харуулах\"-ыг тохиргоонд идэвхжүүлсэн эсэхийг нягтална уу."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Тохиргоо"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Хэрэглэгчийг сэлгэх"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"эвхмэл цэс"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Мэдэгдлүүд"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Харилцан яриа"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бүх чимээгүй мэдэгдлийг арилгах"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Мэдэгдлийн тохиргоог нээнэ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Бүү саад бол горимын түр зогсоосон мэдэгдэл"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Мэдэгдэл байхгүй}=1{Мэдэгдлийг {mode} түр зогсоосон}=2{Мэдэгдлийг {mode} болон өөр нэг горим түр зогсоосон}other{Мэдэгдлийг {mode} болон өөр # горим түр зогсоосон}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Одоо эхлүүлэх"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Толгой хянах"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Хонхны горимыг өөрчлөхийн тулд товшино уу"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"хонхны горим"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, хонхны горимыг өөрчлөхийн тулд товшино уу"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"дууг хаах"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"дууг нээх"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"чичрэх"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Түгжээтэй дэлгэц"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Тэмдэглэл хөтлөх"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Олон ажил зэрэг хийх"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Одоогийн аппыг баруун талд байгаагаар дэлгэцийг хуваахыг ашиглах"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Одоогийн аппыг зүүн талд байгаагаар дэлгэцийг хуваахыг ашиглах"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Дэлгэц хуваахаас бүтэн дэлгэц рүү сэлгэх"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Дэлгэц хуваахыг ашиглаж байхдаа баруун талд эсвэл доор байх апп руу сэлгэ"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Дэлгэц хуваахыг ашиглаж байхдаа зүүн талд эсвэл дээр байх апп руу сэлгэ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Товчлуурын шууд холбоос"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Товчлуурын шууд холбоосыг өөрчлөх"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Товчлолыг хасах уу?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Өгөгдмөл рүү буцааж шинэчлэх үү?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Товчлол оноохын тулд товч дарна уу"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Энэ нь таны захиалгат товчлолыг бүрмөсөн устгана."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Энэ нь таны бүх захиалгат товчлолыг бүрмөсөн устгана."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Товчлолууд хайх"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Ямар ч хайлтын илэрц байхгүй"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Хураах дүрс тэмдэг"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Үйлдлийн товч буюу өөрөөр Мета товчийн дүрс тэмдэг"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Нэмэх дүрс тэмдэг"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Өөрчлөх"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Шинэчлэх"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Болсон"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Дэлгэх дүрс тэмдэг"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"эсвэл"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Гарын тохиргоо"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Товчлол тохируулах"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Хасах"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Тэгье, шинэчилье"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Цуцлах"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Товч дарна уу"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Товчийн хослолыг аль хэдийн ашиглаж байна. Өөр товч туршиж үзнэ үү."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Гар дээрх тусгай товчлуурыг дарна уу"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Сайн байна!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Та бүх аппыг харах зангааг гүйцэтгэлээ"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Зааврын анимаци, түр зогсоохын тулд товшиж, үргэлжлүүлэн тоглуулна уу."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Гарын арын гэрэл"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-с %1$d-р түвшин"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Гэрийн удирдлага"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index b108ccc8eeee..3f902d4e4ebe 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"विजेट"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"विजेट\" शॉर्टकट जोडण्यासाठी, सेटिंग्जमध्ये \"लॉक स्क्रीनवर विजेट दाखवा\" सुरू असल्याची खात्री करा."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"सेटिंग्ज"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"वापरकर्ता स्विच करा"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"पुलडाउन मेनू"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"या सत्रातील सर्व अॅप्स आणि डेटा हटवला जाईल."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचना"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"संभाषणे"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सर्व सायलंट सूचना साफ करा"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"नोटिफिकेशन सेटिंग्ज उघडा"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"व्यत्यय आणून नकाद्वारे सूचना थांबवल्या"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{कोणतेही नोटिफिकेशन नाही}=1{{mode} द्वारे नोटिफिकेशन थांबवली आहेत}=2{{mode} द्वारे आणि आणखी एका मोडद्वारे नोटिफिकेशन थांबवली आहेत}other{{mode} द्वारे आणि आणखी # मोडद्वारे नोटिफिकेशन थांबवली आहेत}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"आता सुरू करा"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"हेड ट्रॅकिंग"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"रिंगर मोड बदलण्यासाठी टॅप करा"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"रिंगर मोड"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, रिंगर मोड बदलण्यासाठी टॅप करा"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्यूट करा"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"म्यूट काढून टाका"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"व्हायब्रेट करा"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"नोंद घ्या"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"मल्टिटास्किंग"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"सद्य ॲप उजवीकडे ठेवून स्प्लिट स्क्रीन वापरा"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"सद्य ॲप डावीकडे ठेवून स्प्लिट स्क्रीन वापरा"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीनवरून फुल स्क्रीनवर स्विच करा"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रीन वापरताना उजवीकडील किंवा खालील अॅपवर स्विच करा"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रीन वापरताना डावीकडील किंवा वरील अॅपवर स्विच करा"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीनदरम्यान: एक अॅप दुसऱ्या अॅपने बदला"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"कृती किंवा मेटा की आयकन"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"अधिक आयकन"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"कस्टमाइझ करा"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"रीसेट करा"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"पूर्ण झाले"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"विस्तार करा आयकन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"किंवा"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"तुमच्या कीबोर्डवर अॅक्शन की प्रेस करा"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"खूप छान!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"तुम्ही ॲप्स पाहण्याचे जेश्चर पूर्ण केले आहे"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ट्यूटोरियल अॅनिमेशन थांबवण्यासाठी किंवा पुन्हा सुरू करण्यासाठी प्ले करा वर क्लिक करा."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"कीबोर्ड बॅकलाइट"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d पैकी %1$d पातळी"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"होम कंट्रोल"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 6b9d6d62e80e..0900288bd13f 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widget"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Untuk menambahkan pintasan \"Widget\", pastikan \"Tunjukkan widget pada skrin kunci\" didayakan dalam tetapan."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Tetapan"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Tunjukkan butang penyelamat skrin"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Tukar pengguna"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu tarik turun"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Semua apl dan data dalam sesi ini akan dipadam."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Pemberitahuan"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Perbualan"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kosongkan semua pemberitahuan senyap"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Buka tetapan pemberitahuan"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pemberitahuan dijeda oleh Jangan Ganggu"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Tiada pemberitahuan}=1{Pemberitahuan dijeda oleh {mode}}=2{Pemberitahuan dijeda oleh {mode} dan satu lagi mod yang lain}other{Pemberitahuan dijeda oleh {mode} dan # mod yang lain}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Mulakan sekarang"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Penjejakan Kepala"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Ketik untuk menukar mod pendering"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"mod pendering"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ketik untuk menukar mod pendering"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"redam"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"nyahredam"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"getar"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci skrin"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Catat nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Berbilang tugas"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Gunakan skrin pisah dengan apl semasa pada sebelah kanan"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Gunakan skrin pisah dengan apl semasa pada sebelah kiri"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih daripada skrin pisah kepada skrin penuh"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Tukar kepada apl di sebelah kanan/bawah semasa menggunakan skrin pisah"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Tukar kepada apl di sebelah kiri/atas semasa menggunakan skrin pisah"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Semasa skrin pisah: gantikan apl daripada satu apl kepada apl lain"</string> @@ -1480,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tekan kekunci tindakan pada papan kekunci anda"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Syabas!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Anda telah melengkapkan gerak isyarat lihat semua apl"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animasi tutorial, klik untuk menjeda dan menyambung semula main."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Cahaya latar papan kekunci"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tahap %1$d daripada %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kawalan Rumah"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 50f75ee552b8..186b60f7b266 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"ဝိဂျက်သုံး၍ အက်ပ်ဖွင့်ရန်အတွက် သင်ဖြစ်ကြောင်း အတည်ပြုရန်လိုသည်။ ထို့ပြင် သင့်တက်ဘလက် လော့ခ်ချထားချိန်၌ပင် မည်သူမဆို ၎င်းတို့ကို ကြည့်နိုင်ကြောင်း သတိပြုပါ။ ဝိဂျက်အချို့ကို လော့ခ်မျက်နှာပြင်အတွက် ရည်ရွယ်ထားခြင်း မရှိသဖြင့် ဤနေရာတွင် ထည့်ပါက မလုံခြုံနိုင်ပါ။"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"နားလည်ပြီ"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ဝိဂျက်များ"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"“ဝိဂျက်များ” ဖြတ်လမ်းလင့်ခ်ထည့်ရန်အတွက် ဆက်တင်များတွင် “လော့ခ်မျက်နှာပြင်ပေါ်၌ ဝိဂျက်များပြရန်” ကိုဖွင့်ထားကြောင်း သေချာပါစေ။"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ဆက်တင်များ"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"စခရင်နားချိန်ပုံ ပြရန်ခလုတ်"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ဆွဲချမီနူး"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ဒီချိတ်ဆက်မှု ထဲက အက်ပ်များ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"အကြောင်းကြားချက်များ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"စကားဝိုင်းများ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"အသံတိတ် အကြောင်းကြားချက်များအားလုံးကို ရှင်းလင်းရန်"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"အကြောင်းကြားချက် ဆက်တင်များ ဖွင့်ရန်"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"အကြောင်းကြားချက်များကို \'မနှောင့်ယှက်ရ\' က ခေတ္တရပ်ထားသည်"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{အကြောင်းကြားချက် မရှိပါ}=1{{mode} က ခဏရပ်ထားသော အကြောင်းကြားချက်များ}=2{{mode} နှင့် အခြားမုဒ်တစ်ခုက ခဏရပ်ထားသော အကြောင်းကြားချက်များ}other{{mode} နှင့် အခြားမုဒ် # ခုက ခဏရပ်ထားသော အကြောင်းကြားချက်များ}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ယခု စတင်ပါ"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ခေါင်းလှုပ်ရှားမှု"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ဖုန်းခေါ်သံမုဒ်သို့ ပြောင်းရန် တို့ပါ"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"အသံမြည်မုဒ်"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>၊ ဖုန်းခေါ်သံမုဒ်သို့ ပြောင်းရန် တို့ပါ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"အသံပိတ်ရန်"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"အသံဖွင့်ရန်"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"တုန်ခါမှု"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"လော့ခ်မျက်နှာပြင်"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"မှတ်စုရေးရန်"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"တစ်ပြိုင်နက် များစွာလုပ်ခြင်း"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"လက်ရှိအက်ပ်ကို ညာ၌ထားကာ မျက်နှာပြင် ခွဲ၍ပြသခြင်း သုံးရန်"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"လက်ရှိအက်ပ်ကို ဘယ်၌ထားကာ မျက်နှာပြင် ခွဲ၍ပြသခြင်း သုံးရန်"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"မျက်နှာပြင် ခွဲ၍ပြသမှုမှ မျက်နှာပြင်အပြည့်သို့ ပြောင်းရန်"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"မျက်နှာပြင်ခွဲ၍ပြသခြင်း သုံးစဉ် ညာ (သို့) အောက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းသုံးစဉ် ဘယ် (သို့) အထက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"မျက်နှာပြင် ခွဲ၍ပြသစဉ်- အက်ပ်တစ်ခုကို နောက်တစ်ခုနှင့် အစားထိုးရန်"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"လက်ကွက်ဖြတ်လမ်းများ"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"လက်ကွက်ဖြတ်လမ်းများကို စိတ်ကြိုက်လုပ်ခြင်း"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ဖြတ်လမ်းလင့်ခ် ဖယ်ရှားမလား။"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"မူရင်းသို့ ပြန်လည်ပြင်ဆင်သတ်မှတ်မလား။"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ဖြတ်လမ်းလင့်ခ်သတ်မှတ်ရန် ကီးကို နှိပ်ပါ"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"၎င်းသည် သင့်စိတ်ကြိုက် ဖြတ်လမ်းလင့်ခ်ကို အပြီးဖျက်ပါမည်။"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"၎င်းသည် သင့်စိတ်ကြိုက်ဖြတ်လမ်းလင့်ခ်အားလုံးကို အပြီးဖျက်မည်။"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ဖြတ်လမ်းများ ရှာရန်"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"ရှာဖွေမှုရလဒ် မရှိပါ"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"လျှော့ပြရန် သင်္ကေတ"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"လုပ်ဆောင်ချက် (သို့) Meta ကီးသင်္ကေတ"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"အပေါင်းသင်္ကေတ"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"စိတ်ကြိုက်လုပ်ရန်"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"ပြင်ဆင်သတ်မှတ်ရန်"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"ပြီးပြီ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ပိုပြရန် သင်္ကေတ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"သို့မဟုတ်"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"ကီးဘုတ်ဆက်တင်များ"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"ဖြတ်လမ်း သတ်မှတ်ရန်"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"ဖယ်ရှားရန်"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ပြန်လည်ပြင်ဆင်သတ်မှတ်မည်"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"မလုပ်တော့"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ကီးကို နှိပ်ပါ"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ကီးပေါင်းစပ်ခြင်းကို သုံးနေပြီးဖြစ်သည်။ အခြားကီးကို စမ်းကြည့်ပါ။"</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ကီးဘုတ်တွင် လုပ်ဆောင်ချက်ကီး နှိပ်ပါ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"အလွန်ကောင်းပါသည်။"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"အက်ပ်အားလုံးကို ကြည့်ခြင်းလက်ဟန် သင်ခန်းစာပြီးပါပြီ"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ရှင်းလင်းပို့ချချက် လှုပ်ရှားသက်ဝင်ပုံ၊ ခဏရပ်ပြီး ဆက်ဖွင့်ရန် နှိပ်ပါ။"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ကီးဘုတ်နောက်မီး"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"အဆင့် %2$d အနက် %1$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"အိမ်ထိန်းချုပ်မှုများ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index f84353f0e182..1ef544b5473e 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"For å åpne en app ved hjelp av en modul må du bekrefte at det er deg. Husk også at hvem som helst kan se dem, selv om nettbrettet er låst. Noen moduler er kanskje ikke laget for å være på låseskjermen og kan være utrygge å legge til der."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Greit"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Moduler"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"For å legge til «Moduler»-snarveien, sørg for at «Vis moduler på låseskjermen» er slått på i innstillingene."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Innstillinger"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Bytt bruker"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullegardinmeny"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Varsler"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Fjern alle lydløse varsler"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Åpne varslingsinnstillingene"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Varsler er satt på pause av «Ikke forstyrr»"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ingen varsler}=1{Varsler er satt på pause av {mode}}=2{Varsler er satt på pause av {mode} og én modus til}other{Varsler er satt på pause av {mode} og # moduser til}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start nå"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Hodesporing"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Trykk for å endre ringemodus"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modus for ringeprogrammet"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, trykk for å endre ringemodus"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"kutt lyden"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"slå på lyden"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrer"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Låseskjerm"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Ta et notat"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Bruk delt skjerm med den nåværende appen til høyre"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Bruk delt skjerm med den nåværende appen til venstre"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bytt fra delt skjerm til fullskjerm"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bytt til appen til høyre eller under mens du bruker delt skjerm"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bytt til appen til venstre eller over mens du bruker delt skjerm"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"I delt skjerm: Bytt ut en app"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Hurtigtaster"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Tilpass hurtigtastene"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Vil du fjerne hurtigtasten?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vil du tilbakestille til standard?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Trykk på en tast for å tilordne hurtigtasten"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Dette fører til at den egendefinerte hurtigtasten slettes permanent."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Dette fører til at alle de egendefinerte snarveiene dine slettes permanent."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Snarveier til søk"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Ingen søkeresultater"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Skjul-ikon"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Handlings- eller Meta-tast-ikon"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plussikon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Tilpass"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Tilbakestill"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Ferdig"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vis-ikon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Tastaturinnstillinger"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Angi hurtigtast"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Fjern"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, tilbakestill"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Avbryt"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Trykk på tasten"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tastekombinasjonen brukes allerede. Prøv en annen tast."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Trykk på handlingstasten på tastaturet"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bra!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du har fullført bevegelsen for å se alle apper"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Veiledningsanimasjon. Klikk for å sette avspillingen på pause og gjenoppta den."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrunnslys for tastatur"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Hjemkontroller"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 8fd83677334a..9a97010037d1 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"विजेट प्रयोग गरी एप खोल्न तपाईंले आफ्नो पहिचान पुष्टि गर्नु पर्ने हुन्छ। साथै, तपाईंको ट्याब्लेट लक भएका बेला पनि सबै जनाले तिनलाई देख्न सक्छन् भन्ने कुरा ख्याल गर्नुहोस्। केही विजेटहरू लक स्क्रिनमा प्रयोग गर्ने उद्देश्यले नबनाइएका हुन सक्छन् र तिनलाई यहाँ हाल्नु सुरक्षित नहुन सक्छ।"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"बुझेँ"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"विजेटहरू"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"विजेट\" सर्टकट हाल्न सेटिङमा \"लक स्क्रिनमा विजेट देखाउनुहोस्\" नामक विकल्प अन गरिएको छ भन्ने सुनिश्चित गर्नुहोस्।"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"सेटिङ"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"स्क्रिनसेभर देखाउने बटन"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"प्रयोगकर्ता फेर्नुहोस्"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"पुलडाउन मेनु"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"यो सत्रमा भएका सबै एपहरू र डेटा मेटाइने छ।"</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचनाहरू"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सबै मौन सूचनाहरू हटाउनुहोस्"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"नोटिफिकेसन सेटिङ खोल्नुहोस्"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{कुनै पनि नोटिफिकेसन छैन}=1{{mode} ले गर्दा नोटिफिकेसनहरू पज गरिएका छन्}=2{{mode} र अन्य एक मोडले गर्दा नोटिफिकेसनहरू पज गरिएका छन्}other{{mode} र अन्य # वटा मोडले गर्दा नोटिफिकेसनहरू पज गरिएका छन्}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"अहिले न"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"हेड ट्र्याकिङ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"रिङ्गर मोड बदल्न ट्याप गर्नुहोस्"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"घण्टी बजाउने मोड"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, घण्टी बजाउने मोड बदल्न ट्याप गर्नुहोस्"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्युट गर्नुहोस्"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"अनम्युट गर्नुहोस्"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"कम्पन गर्नुहोस्"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"स्क्रिन लक गर्नुहोस्"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"नोट लेख्नुहोस्"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"एकै पटक एकभन्दा बढी एप चलाउन मिल्ने सुविधा"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"हालको एप दायाँ भागमा पारेर स्प्लिट स्क्रिन प्रयोग गर्नुहोस्"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"हालको एप बायाँ भागमा पारेर स्प्लिट स्क्रिन प्रयोग गर्नुहोस्"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रिनको साटो फुल स्क्रिन प्रयोग गर्नुहोस्"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा दायाँ वा तलको एप चलाउनुहोस्"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा बायाँ वा माथिको एप चलाउनुहोस्"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"किबोर्डका सर्टकटहरू"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"किबोर्डका सर्टकटहरू कस्टमाइज गर्नुहोस्"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"सर्टकट हटाउने हो?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"सर्टकट रिसेट गरी डिफल्ट बनाउने हो?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"सर्टकट असाइन गर्न की थिच्नुहोस्"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"यसो गर्नुभयो भने तपाईंको कस्टम सर्टकट सदाका लागि मेटिने छ।"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"तपाईंले यसो गर्नुभयो भने तपाईंका सबै कस्टम सर्टकटहरू सदाका लागि मेटाइने छन्।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"खोजका सर्टकटहरू"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"कुनै पनि खोज परिणाम भेटिएन"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\"कोल्याप्स गर्नुहोस्\" आइकन"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"एक्सन वा Meta कीको आइकन"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"प्लस आइकन"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"कस्टमाइज गर्नुहोस्"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"रिसेट गर्नुहोस्"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"पूरा भयो"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\"एक्स्पान्ड गर्नुहोस्\" आइकन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"वा"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"किबोर्डसम्बन्धी सेटिङ"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"सर्टकट सेट गर्नुहोस्"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"हटाउनुहोस्"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"अँ, रिसेट गर्नुहोस्"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"रद्द गर्नुहोस्"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"की थिच्नुहोस्"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"यो की कम्बिनेसन प्रयोग गरिसकिएको छ। अर्कै की प्रयोग गरी हेर्नुहोस्।"</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"आफ्नो किबोर्डमा भएको एक्सन की थिच्नुहोस्"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"स्याबास!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"तपाईंले जेस्चर प्रयोग गरी सबै एपहरू हेर्ने तरिका सिक्नुभएको छ"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ट्युटोरियलको एनिमेसन, पज वा सुचारु गर्न क्लिक गर्नुहोस्।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"किबोर्ड ब्याकलाइट"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d मध्ये %1$d औँ स्तर"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"होम कन्ट्रोलहरू"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index d03b5fbfd190..e7fe53660aa2 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Als je de snelkoppeling Widgets wilt toevoegen, zorg je dat Widgets tonen op het vergrendelingsscherm aanstaat in de instellingen."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Instellingen"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Knop Screensaver tonen"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Gebruiker wijzigen"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pull-downmenu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle apps en gegevens in deze sessie worden verwijderd."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Meldingen"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekken"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle stille meldingen wissen"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Instellingen voor meldingen openen"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Meldingen onderbroken door \'Niet storen\'"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Geen meldingen}=1{Meldingen onderbroken door {mode}}=2{Meldingen onderbroken door {mode} en 1 andere modus}other{Meldingen onderbroken door {mode} en # andere modi}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Nu starten"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Hoofdtracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tik om de beltoonmodus te wijzigen"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"beltoonmodus"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, tik om de belsoftwaremodus te wijzigen"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"geluid uit"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"geluid aanzetten"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"trillen"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Scherm vergrendelen"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Notitie maken"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasken"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Gesplitst scherm gebruiken met de huidige app aan de rechterkant"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Gesplitst scherm gebruiken met de huidige app aan de linkerkant"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Van gesplitst scherm naar volledig scherm schakelen"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Naar de app rechts of onderaan gaan als je een gesplitst scherm gebruikt"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Naar de app links of bovenaan gaan als je een gesplitst scherm gebruikt"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijdens gesplitst scherm: een app vervangen door een andere"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icoon voor actie- of metatoets"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Plusicoon"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Aanpassen"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Resetten"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Klaar"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icoon voor uitvouwen"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Druk op de actietoets op het toetsenbord"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Goed gedaan!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Je weet nu hoe je het gebaar Alle apps bekijken maakt"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial-animatie, klik om het afspelen te onderbreken en te hervatten."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Achtergrondverlichting van toetsenbord"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d van %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Bediening voor in huis"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 91900e7ee3df..35704ea2fcaa 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"ଏକ ୱିଜେଟ ବ୍ୟବହାର କରି ଗୋଟିଏ ଆପ ଖୋଲିବା ପାଇଁ ଏହା ଆପଣ ଅଟନ୍ତି ବୋଲି ଆପଣଙ୍କୁ ଯାଞ୍ଚ କରିବାକୁ ହେବ। ଆହୁରି ମଧ୍ୟ, ଆପଣଙ୍କ ଟାବଲେଟ ଲକ ଥିଲେ ମଧ୍ୟ ଯେ କୌଣସି ବ୍ୟକ୍ତି ଏହାକୁ ଭ୍ୟୁ କରିପାରିବେ ବୋଲି ମନେ ରଖନ୍ତୁ। କିଛି ୱିଜେଟ ଆପଣଙ୍କ ଲକ ସ୍କ୍ରିନ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ହୋଇନଥାଇପାରେ ଏବଂ ଏଠାରେ ଯୋଗ କରିବା ଅସୁରକ୍ଷିତ ହୋଇପାରେ।"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"ବୁଝିଗଲି"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ୱିଜେଟ"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"ୱିଜେଟ\" ସର୍ଟକଟ ଯୋଗ କରିବାକୁ ସେଟିଂସରେ \"ଲକ ସ୍କ୍ରିନରେ ୱିଜେଟଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ\"କୁ ସକ୍ଷମ କରାଯାଇଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ।"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ସେଟିଂସ"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"ସ୍କ୍ରିନସେଭର ବଟନ ଦେଖାନ୍ତୁ"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ୟୁଜର୍ ବଦଳାନ୍ତୁ"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ପୁଲଡାଉନ ମେନୁ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ଏହି ସେସନର ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ସମସ୍ତ ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଖାଲି କରନ୍ତୁ"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"ବିଜ୍ଞପ୍ତି ସେଟିଂସ ଖୋଲନ୍ତୁ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍ ହୋଇଛି"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ}=1{{mode} ଦ୍ୱାରା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବିରତ କରାଯାଇଛି}=2{{mode} ଏବଂ ଅନ୍ୟ ଏକ ମୋଡ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବିରତ କରାଯାଇଛି}other{{mode} ଏବଂ ଅନ୍ୟ # ମୋଡ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବିରତ କରାଯାଇଛି}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ହେଡ ଟ୍ରାକିଂ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ରିଙ୍ଗର୍ ମୋଡ୍ ବଦଳାଇବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ରିଂଗର ମୋଡ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ରିଙ୍ଗର ମୋଡ ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ମ୍ୟୁଟ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ଅନ୍-ମ୍ୟୁଟ୍ କରନ୍ତୁ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ଭାଇବ୍ରେଟ୍"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ଲକ ସ୍କ୍ରିନ"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"ଏକ ନୋଟ ଲେଖନ୍ତୁ"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ମଲ୍ଟିଟାସ୍କିଂ"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ଡାହାଣରେ ବର୍ତ୍ତମାନର ଆପ ସହିତ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ବ୍ୟବହାର କରନ୍ତୁ"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ବାମରେ ବର୍ତ୍ତମାନର ଆପ ସହିତ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ବ୍ୟବହାର କରନ୍ତୁ"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସୁଇଚ କରନ୍ତୁ"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ଡାହାଣପଟର ବା ତଳର ଆପକୁ ସୁଇଚ କରନ୍ତୁ"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ବାମପଟର ବା ଉପରର ଆପକୁ ସୁଇଚ କରନ୍ତୁ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"କୀବୋର୍ଡ ସର୍ଟକଟ"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"କୀବୋର୍ଡ ସର୍ଟକଟଗୁଡ଼ିକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ସର୍ଟକଟକୁ କାଢ଼ି ଦେବେ?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ଡିଫଲ୍ଟରେ ପୁଣି ରିସେଟ କରିବେ?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ସର୍ଟକଟ ଆସାଇନ କରିବା ପାଇଁ କୀ\'କୁ ଦବାନ୍ତୁ"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ଏହା ଆପଣଙ୍କ କଷ୍ଟମ ସର୍ଟକଟକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିଦେବ।"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ଏହା ଆପଣଙ୍କର ସମସ୍ତ କଷ୍ଟମ ସର୍ଟକଟକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିଦେବ।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ସର୍ଚ୍ଚ ସର୍ଟକଟ"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"କୌଣସି ସର୍ଚ୍ଚ ଫଳାଫଳ ନାହିଁ"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ଆଇକନକୁ ସଙ୍କୁଚିତ କରନ୍ତୁ"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ଆକ୍ସନ କିମ୍ବା ମେଟା କୀ ଆଇକନ"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"ପ୍ଲସ ଆଇକନ"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"କଷ୍ଟମାଇଜ କରନ୍ତୁ"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"ରିସେଟ କରନ୍ତୁ"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"ହୋଇଗଲା"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ଆଇକନକୁ ବିସ୍ତାର କରନ୍ତୁ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"କିମ୍ବା"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"କୀବୋର୍ଡ ସେଟିଂ"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"ସର୍ଟକଟ ସେଟ କରନ୍ତୁ"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"କାଢ଼ି ଦିଅନ୍ତୁ"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ହଁ, ରିସେଟ କରନ୍ତୁ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ବାତିଲ କରନ୍ତୁ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"କୀ ଦବାନ୍ତୁ"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"କୀ କମ୍ବିନେସନ ପୂର୍ବରୁ ବ୍ୟବହାର କରାଯାଉଛି। ଅନ୍ୟ ଏକ କୀ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ।"</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ଆପଣଙ୍କର କୀବୋର୍ଡରେ ଆକ୍ସନ କୀ\'କୁ ଦବାନ୍ତୁ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ବହୁତ ବଢ଼ିଆ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ଆପଣ ସମସ୍ତ ଆପ୍ସ ଜେଶ୍ଚରକୁ ଭ୍ୟୁ କରିବା ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ଟ୍ୟୁଟୋରିଆଲ ଆନିମେସନ, ପ୍ଲେ କରିବା ବିରତ କରି ପୁଣି ଆରମ୍ଭ କରିବାକୁ କ୍ଲିକ କରନ୍ତୁ।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"କୀବୋର୍ଡ ବେକଲାଇଟ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dରୁ %1$d ନମ୍ବର ଲେଭେଲ"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ହୋମ କଣ୍ଟ୍ରୋଲ୍ସ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index ba51bf20a0ff..68cd2b42f069 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"ਵਿਜੇਟ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਐਪ ਖੋਲ੍ਹਣ ਲਈ, ਤੁਹਾਨੂੰ ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਦੀ ਲੋੜ ਪਵੇਗੀ ਕਿ ਇਹ ਤੁਸੀਂ ਹੀ ਹੋ। ਨਾਲ ਹੀ, ਇਹ ਵੀ ਧਿਆਨ ਵਿੱਚ ਰੱਖੋ ਕਿ ਕੋਈ ਵੀ ਉਨ੍ਹਾਂ ਨੂੰ ਦੇਖ ਸਕਦਾ ਹੈ, ਭਾਵੇਂ ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਲਾਕ ਹੋਵੇ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਕੁਝ ਵਿਜੇਟ ਤੁਹਾਡੀ ਲਾਕ ਸਕ੍ਰੀਨ ਲਈ ਨਾ ਬਣੇ ਹੋਣ ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਇੱਥੇ ਸ਼ਾਮਲ ਕਰਨਾ ਅਸੁਰੱਖਿਅਤ ਹੋਵੇ।"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"ਸਮਝ ਲਿਆ"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ਵਿਜੇਟ"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"ਵਿਜੇਟ\" ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਪੱਕਾ ਕਰੋ ਕਿ ਸੈਟਿੰਗਾਂ ਵਿੱਚ \"ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਵਿਜੇਟ ਦਿਖਾਓ\" ਚਾਲੂ ਹੈ।"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ਸੈਟਿੰਗਾਂ"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ਪੁੱਲਡਾਊਨ ਮੀਨੂ"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"ਸੂਚਨਾਵਾਂ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ਗੱਲਾਂਬਾਤਾਂ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ਸਾਰੀਆਂ ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"ਸੂਚਨਾ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ਕੋਈ ਸੂਚਨਾ ਨਹੀਂ ਹੈ}=1{{mode} ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ}=2{{mode} ਅਤੇ ਇੱਕ ਹੋਰ ਮੋਡ ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ}other{{mode} ਅਤੇ # ਹੋਰ ਮੋਡਾਂ ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣੇ ਸ਼ੁਰੂ ਕਰੋ"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ਹੈੱਡ ਟਰੈਕਿੰਗ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ਰਿੰਗਰ ਮੋਡ ਨੂੰ ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ਰਿੰਗਰ ਮੋਡ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ਰਿੰਗਰ ਮੋਡ ਨੂੰ ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ਮਿਊਟ ਕਰੋ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ਅਣਮਿਊਟ ਕਰੋ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ਥਰਥਰਾਹਟ"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ਲਾਕ ਸਕ੍ਰੀਨ"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"ਨੋਟ ਲਿਖੋ"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ਮਲਟੀਟਾਸਕਿੰਗ"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ਸੱਜੇ ਪਾਸੇ ਦਿੱਤੀ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ਖੱਬੇ ਪਾਸੇ ਦਿੱਤੀ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਸੱਜੇ ਜਾਂ ਹੇਠਾਂ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਖੱਬੇ ਜਾਂ ਉੱਪਰ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਨੂੰ ਬਦਲੋ"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਵਿਉਂਤਬੱਧ ਕਰੋ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ਕੀ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ਕੀ ਵਾਪਸ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ \'ਤੇ ਰੀਸੈੱਟ ਕਰਨਾ ਹੈ?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ਸ਼ਾਰਟਕੱਟ ਨਿਰਧਾਰਿਤ ਕਰਨ ਲਈ ਕੁੰਜੀ ਦਬਾਓ"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ਇਸ ਨਾਲ ਤੁਹਾਡੇ ਵਿਉਂਤੇ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ਇਸ ਨਾਲ ਤੁਹਾਡੇ ਸਾਰੇ ਵਿਉਂਤਬੱਧ ਸ਼ਾਰਟਕੱਟ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟ ਜਾਣਗੇ।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ਸ਼ਾਰਟਕੱਟ ਖੋਜੋ"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"ਕੋਈ ਖੋਜ ਨਤੀਜਾ ਨਹੀਂ ਮਿਲਿਆ"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ਪ੍ਰਤੀਕ ਨੂੰ ਸਮੇਟੋ"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ਕਾਰਵਾਈ ਜਾਂ Meta ਕੁੰਜੀ ਪ੍ਰਤੀਕ"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"ਜੋੜ-ਚਿੰਨ੍ਹ ਦਾ ਪ੍ਰਤੀਕ"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"ਵਿਉਂਤਬੱਧ ਕਰੋ"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"ਰੀਸੈੱਟ ਕਰੋ"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"ਹੋ ਗਿਆ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ਪ੍ਰਤੀਕ ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ਜਾਂ"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"ਕੀ-ਬੋਰਡ ਸੈਟਿੰਗਾਂ"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"ਸ਼ਾਰਟਕੱਟ ਸੈੱਟ ਕਰੋ"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"ਹਟਾਓ"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ਹਾਂ, ਰੀਸੈੱਟ ਕਰੋ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ਰੱਦ ਕਰੋ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ਕੁੰਜੀ ਦਬਾਓ"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ਕੁੰਜੀ ਸੁਮੇਲ ਪਹਿਲਾਂ ਹੀ ਵਰਤੋਂ ਵਿੱਚ ਹੈ। ਕੋਈ ਹੋਰ ਕੁੰਜੀ ਵਰਤ ਕੇ ਦੇਖੋ।"</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ਆਪਣੇ ਕੀ-ਬੋਰਡ \'ਤੇ ਕਾਰਵਾਈ ਕੁੰਜੀ ਨੂੰ ਦਬਾਓ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ਬਹੁਤ ਵਧੀਆ!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ਤੁਸੀਂ \'ਸਾਰੀਆਂ ਐਪਾਂ ਦੇਖੋ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ ਹੈ"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ਟਿਊਟੋਰੀਅਲ ਐਨੀਮੇਸ਼ਨ, ਰੋਕਣ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ਕੀ-ਬੋਰਡ ਬੈਕਲਾਈਟ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ਵਿੱਚੋਂ %1$d ਪੱਧਰ"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ਹੋਮ ਕੰਟਰੋਲ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 67856683e4a1..a970e2891e61 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -116,7 +116,7 @@ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kiedy nagrywasz cały ekran, nagrane zostanie wszystko, co jest na nim widoczne. Dlatego uważaj na hasła, dane do płatności, wiadomości, zdjęcia, nagrania audio czy filmy."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kiedy nagrywasz aplikację, wszystko, co jest w niej wyświetlane lub odtwarzane, zostaje nagrane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Nagrywaj ekran"</string> - <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Wybieranie aplikacji do nagrywania"</string> + <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Wybierz aplikację do nagrywania"</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Nagrywaj dźwięk"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Dźwięki z urządzenia"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Dźwięki odtwarzane na urządzeniu, na przykład muzyka, połączenia i dzwonki"</string> @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widżety"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Aby dodać skrót „Widżety”, upewnij się, że opcja „Pokaż widżety na ekranie blokady” jest włączona w ustawieniach."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Ustawienia"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Przycisk Pokaż wygaszacz ekranu"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Przełącz użytkownika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Wszystkie aplikacje i dane w tej sesji zostaną usunięte."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Powiadomienia"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Rozmowy"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Usuń wszystkie ciche powiadomienia"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Otwórz ustawienia powiadomień"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Powiadomienia wstrzymane przez tryb Nie przeszkadzać"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Brak powiadomień}=1{Powiadomienia są wstrzymane przez tryb {mode}}=2{Powiadomienia są wstrzymane przez tryb {mode} i 1 inny tryb}few{Powiadomienia są wstrzymane przez tryb {mode} i # inne tryby}many{Powiadomienia są wstrzymane przez tryb {mode} i # innych trybów}other{Powiadomienia są wstrzymane przez tryb {mode} i # innego trybu}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Rozpocznij teraz"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Śledzenie głowy"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Kliknij, aby zmienić tryb dzwonka"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"tryb dzwonka"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Kliknij, aby zmienić tryb dzwonka"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"wycisz"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"wyłącz wyciszenie"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"włącz wibracje"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Zablokuj ekran"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Zanotuj"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Wielozadaniowość"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Podziel ekran z bieżącą aplikacją widoczną po prawej"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Podziel ekran z bieżącą aplikacją widoczną po lewej"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Przełącz podzielony ekran na pełny ekran"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Przełącz się na aplikację po prawej lub poniżej na podzielonym ekranie"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Przełącz się na aplikację po lewej lub powyżej na podzielonym ekranie"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Podczas podzielonego ekranu: zastępowanie aplikacji"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikona klawisza działania/meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikona plusa"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Dostosuj"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Resetuj"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Gotowe"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozwijania"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"lub"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Naciśnij klawisz działania na klawiaturze"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Brawo!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Znasz już gest wyświetlania wszystkich aplikacji"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacja z samouczkiem. Kliknij, aby wstrzymać lub wznowić odtwarzanie."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podświetlenie klawiatury"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Poziom %1$d z %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Sterowanie domem"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 95152274b3ee..f28de4ecc2fa 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -334,7 +334,7 @@ <string name="quick_settings_camera_label" msgid="5612076679385269339">"Acesso à câmera"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acesso ao microfone"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponível"</string> - <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueado"</string> + <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueada"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"Dispositivo de mídia"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"Usuário"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Para abrir um app usando um widget, você precisa confirmar sua identidade. E não se esqueça que qualquer pessoa pode ver os widgets, mesmo com o tablet bloqueado. Além disso, alguns apps não foram criados para a tela de bloqueio, é melhor manter a segurança."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Entendi"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Para adicionar o atalho Widgets, verifique se a opção \"Mostrar widgets na tela de bloqueio\" está ativada nas configurações."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Configurações"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu suspenso"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificações"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Abrir configurações de notificações"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Sem notificações}=1{Notificações pausadas pelo modo {mode}}=2{Notificações pausadas por {mode} e mais um modo}one{Notificações pausadas por {mode} e mais # modo}many{Notificações pausadas por {mode} e mais # de modos}other{Notificações pausadas por {mode} e mais # modos}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rastreamento de cabeça"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toque para mudar o modo da campainha"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modo da campainha"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Toque para mudar o modo da campainha"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"desativar o som"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ativar o som"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Criar nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitarefas"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Usar a tela dividida com o app à direita"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Usar a tela dividida com o app à esquerda"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mudar para o app à direita ou abaixo ao usar a tela dividida"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mudar para o app à esquerda ou acima ao usar a tela dividida"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string> @@ -1430,12 +1431,10 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Atalhos do teclado"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personalizar atalhos de teclado"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remover atalho?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Redefinir para o padrão?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pressione a tecla para atribuir o atalho"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Essa ação vai excluir permanentemente seu atalho personalizado."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Essa ação vai excluir permanentemente todos os seus atalhos personalizados."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pesquisar atalhos"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Nenhum resultado de pesquisa"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string> @@ -1452,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Configurações do teclado"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Definir atalho"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Remover"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sim, redefinir"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pressione a tecla"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Essa combinação de teclas já está em uso. Tente outra tecla."</string> @@ -1485,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pressione a tecla de ação no teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Muito bem!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Você concluiu o gesto para ver todos os apps"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animação do tutorial. Clique para pausar ou retomar a reprodução."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Automação residencial"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 40df4c02aed9..83aa9cf35d8f 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Para adicionar o atalho \"Widgets\", certifique-se de que a opção \"Mostrar widgets no ecrã de bloqueio\" está ativada nas definições."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Definições"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Botão Mostrar proteção de ecrã"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mudar utilizador"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pendente"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Todas as apps e dados desta sessão serão eliminados."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificações"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Limpar todas as notificações silenciosas"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Abrir definições de notificações"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações colocadas em pausa pelo modo Não incomodar."</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Sem notificações}=1{Notificações pausadas pelo modo {mode}}=2{Notificações pausadas pelo modo {mode} e mais um modo}many{Notificações pausadas pelo modo {mode} e mais # modos}other{Notificações pausadas pelo modo {mode} e mais # modos}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Começar agora"</string> @@ -872,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Ecrã de bloqueio"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Tire notas"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Execução de várias tarefas em simultâneo"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Use o ecrã dividido com a app atual à direita"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Use o ecrã dividido com a app atual à esquerda"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar de ecrã dividido para ecrã inteiro"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mudar para a app à direita ou abaixo enquanto usa o ecrã dividido"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mude para a app à esquerda ou acima enquanto usa o ecrã dividido"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante o ecrã dividido: substituir uma app por outra"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 95152274b3ee..f28de4ecc2fa 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -334,7 +334,7 @@ <string name="quick_settings_camera_label" msgid="5612076679385269339">"Acesso à câmera"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acesso ao microfone"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponível"</string> - <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueado"</string> + <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueada"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"Dispositivo de mídia"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"Usuário"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Para abrir um app usando um widget, você precisa confirmar sua identidade. E não se esqueça que qualquer pessoa pode ver os widgets, mesmo com o tablet bloqueado. Além disso, alguns apps não foram criados para a tela de bloqueio, é melhor manter a segurança."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Entendi"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgets"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Para adicionar o atalho Widgets, verifique se a opção \"Mostrar widgets na tela de bloqueio\" está ativada nas configurações."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Configurações"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu suspenso"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificações"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Abrir configurações de notificações"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Sem notificações}=1{Notificações pausadas pelo modo {mode}}=2{Notificações pausadas por {mode} e mais um modo}one{Notificações pausadas por {mode} e mais # modo}many{Notificações pausadas por {mode} e mais # de modos}other{Notificações pausadas por {mode} e mais # modos}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rastreamento de cabeça"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toque para mudar o modo da campainha"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modo da campainha"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Toque para mudar o modo da campainha"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"desativar o som"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ativar o som"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Criar nota"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitarefas"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Usar a tela dividida com o app à direita"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Usar a tela dividida com o app à esquerda"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mudar para o app à direita ou abaixo ao usar a tela dividida"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mudar para o app à esquerda ou acima ao usar a tela dividida"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string> @@ -1430,12 +1431,10 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Atalhos do teclado"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personalizar atalhos de teclado"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remover atalho?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Redefinir para o padrão?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pressione a tecla para atribuir o atalho"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Essa ação vai excluir permanentemente seu atalho personalizado."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Essa ação vai excluir permanentemente todos os seus atalhos personalizados."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pesquisar atalhos"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Nenhum resultado de pesquisa"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string> @@ -1452,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Configurações do teclado"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Definir atalho"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Remover"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sim, redefinir"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pressione a tecla"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Essa combinação de teclas já está em uso. Tente outra tecla."</string> @@ -1485,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pressione a tecla de ação no teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Muito bem!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Você concluiu o gesto para ver todos os apps"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animação do tutorial. Clique para pausar ou retomar a reprodução."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Automação residencial"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 3b5cd894d417..ea320a141c6e 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Pentru a deschide o aplicație folosind un widget, va trebui să-ți confirmi identitatea. În plus, reține că oricine poate să vadă widgeturile, chiar dacă tableta este blocată. Este posibil ca unele widgeturi să nu fi fost create pentru ecranul de blocare și poate fi nesigur să le adaugi aici."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"OK"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgeturi"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Pentru a adăuga comanda rapidă Widgeturi, verifică dacă opțiunea Afișează widgeturi pe ecranul de blocare este activată în setări."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Setări"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Schimbă utilizatorul"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"meniu vertical"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificări"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversații"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Șterge toate notificările silențioase"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Deschide setările pentru notificări"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificări întrerupte prin „Nu deranja”"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nicio notificare}=1{Notificările au fost întrerupte de {mode}}=2{Notificările au fost întrerupte de {mode} și de un alt mod}few{Notificările au fost întrerupte de {mode} și de alte # moduri}other{Notificările au fost întrerupte de {mode} și de alte # de moduri}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Începe acum"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Urmărirea mișcărilor capului"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Atinge pentru a schimba modul soneriei"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modul sonerie"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, atinge pentru a schimba modul soneriei"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"dezactivează sunetul"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"activează sunetul"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrații"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Ecranul de blocare"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Creează o notă"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Folosește ecranul împărțit cu aplicația curentă în dreapta"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Folosește ecranul împărțit cu aplicația curentă în stânga"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Comută de la ecranul împărțit la ecranul complet"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Treci la aplicația din dreapta sau de mai jos cu ecranul împărțit"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Treci la aplicația din stânga sau de mai sus cu ecranul împărțit"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"În modul ecran împărțit: înlocuiește o aplicație cu alta"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Comenzi rapide de la tastatură"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personalizează comenzile rapide de la tastatură"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Elimini comanda rapidă?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Resetezi la valorile prestabilite?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Apasă tasta pentru a atribui comanda rapidă"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Astfel, se va șterge definitiv comanda rapidă personalizată."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Astfel, se vor șterge definitiv toate comenzile rapide personalizate."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Comenzi directe de căutare"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Niciun rezultat al căutării"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Pictograma de restrângere"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Pictograma pentru acțiune sau tastă Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Pictograma plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personalizează"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Resetează"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Gata"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Pictograma de extindere"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"sau"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Setările tastaturii"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Setează o comandă rapidă"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Elimină"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Da, resetează"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Anulează"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Apasă tasta"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Combinația de taste este deja folosită. Încearcă altă tastă."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Apasă tasta de acțiuni de pe tastatură"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Felicitări!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Ai finalizat gestul pentru afișarea tuturor aplicațiilor"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animat, dă clic pentru a întrerupe și a relua redarea."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Iluminarea din spate a tastaturii"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivelul %1$d din %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Comenzi pentru locuință"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index b02678738b90..f78593681f69 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Виджеты"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Чтобы создать ярлык \"Виджеты\", убедитесь, что в настройках включена функция \"Показывать виджеты на заблокированном экране\"."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Настройки"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Сменить пользователя."</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"раскрывающееся меню"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Все приложения и данные этого профиля будут удалены."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Уведомления"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговоры"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Отклонить все беззвучные уведомления"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Открыть настройки уведомлений"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"В режиме \"Не беспокоить\" уведомления заблокированы"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Уведомлений нет}=1{Режим \"{mode}\" приостанавливает уведомления}=2{Режим \"{mode}\" и ещё один режим приостанавливают уведомления}one{Режим \"{mode}\" и ещё # режим приостанавливают уведомления}few{Режим \"{mode}\" и ещё # режима приостанавливают уведомления}many{Режим \"{mode}\" и ещё # режимов приостанавливают уведомления}other{Режим \"{mode}\" и ещё # режима приостанавливают уведомления}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Начать"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Динамичное"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Нажмите, чтобы изменить режим звонка."</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"режим звонка"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Нажмите, чтобы изменить режим звонка."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"отключить звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"включить звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"включить вибрацию"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокировать экран"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Создать заметку"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Многозадачность"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Разделить экран и поместить это приложение справа"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Разделить экран и поместить это приложение слева"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Изменить режим разделения экрана на полноэкранный режим"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Перейти к приложению справа или внизу на разделенном экране"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Перейти к приложению слева или вверху на разделенном экране"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"В режиме разделения экрана заменить одно приложение другим"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Значок клавиши Meta для выполнения действия"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Значок плюса"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Настроить"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Сбросить"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Готово"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Развернуть\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Нажмите клавишу действия на клавиатуре."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Блестяще!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Вы выполнили жест для просмотра всех приложений."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимация в руководстве. Нажмите, чтобы приостановить или продолжить воспроизведение."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Подсветка клавиатуры"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Уровень %1$d из %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Управление домом"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index a496c7c69aa9..68cdef71535f 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"විජට් එකක් භාවිතයෙන් යෙදුමක් විවෘත කිරීමට, ඔබට ඒ ඔබ බව සත්යාපනය කිරීමට අවශ්ය වනු ඇත. එසේම, ඔබේ ටැබ්ලටය අගුළු දමා ඇති විට පවා ඕනෑම කෙනෙකුට ඒවා බැලිය හැකි බව මතක තබා ගන්න. සමහර විජට් ඔබේ අගුළු තිරය සඳහා අදහස් කර නොතිබිය හැකි අතර මෙහි එක් කිරීමට අනාරක්ෂිත විය හැක."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"තේරුණා"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"විජට්"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"විජට්\" කෙටිමඟ එක් කිරීමට, සැකසීම් තුළ \"අගුළු තිරයෙහි විජට් පෙන්වන්න\" සබල කර ඇති බවට වග බලා ගන්න."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"සැකසීම්"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"පරිශීලක මාරුව"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"නිපතන මෙනුව"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"දැනුම් දීම්"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"සංවාද"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"සියලු නිහඬ දැනුම්දීම් හිස් කරන්න"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"දැනුම්දීම් සැකසීම් විවෘත කරන්න"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{දැනුම්දීම් නැත}=1{{mode} මගින් දැනුම්දීම් විරාම කරන ලදි}=2{{mode} සහ තව එක ප්රකාරයක් මගින් දැනුම්දීම් විරාම කරන ලදි}one{{mode} සහ තව ප්රකාර #ක් මගින් දැනුම්දීම් විරාම කරන ලදි}other{{mode} සහ තව ප්රකාර #ක් මගින් දැනුම්දීම් විරාම කරන ලදි}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"දැන් අරඹන්න"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"හිස ලුහුබැඳීම"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"නාදකය වෙනස් කිරීමට තට්ටු කරන්න"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"හඬ නඟන ආකාරය"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, හඬ නඟන ප්රකාරය වෙනස් කිරීමට තට්ටු කරන්න"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"නිහඬ කරන්න"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"නිශ්ශබ්දතාවය ඉවත් කරන්න"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"කම්පනය"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"තිරය අගුළු දමන්න"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"සටහනක් ගන්න"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"බහුකාර්ය"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"දකුණේ වත්මන් යෙදුම සමග බෙදීම් තිරය භාවිතා කරන්න"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"වම් පැත්තේ වත්මන් යෙදුම සමග බෙදීම් තිරය භාවිතා කරන්න"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"බෙදුම් තිරයේ සිට පූර්ණ තිරයට මාරු වන්න"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"බෙදුම් තිරය භාවිත කරන අතරතුර දකුණේ හෝ පහළින් ඇති යෙදුමට මාරු වන්න"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"බෙදුම් තිරය භාවිත කරන අතරතුර වමේ හෝ ඉහළ ඇති යෙදුමට මාරු වන්න"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්රතිස්ථාපනය කරන්න"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"යතුරු පුවරු කෙටි මං"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"යතුරුපුවරු කෙටිමං අභිරුචිකරණය කරන්න"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"කෙටිමඟ ඉවත් කරන්න ද?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"පෙරනිමියට යළි සකසන්න ද?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"කෙටිමඟ පැවරීමට යතුර ඔබන්න"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"මෙය ඔබේ අභිරුචි කෙටිමඟ ස්ථිරවම මකනු ඇත."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"මෙය ඔබේ සියලු අභිරුචි කෙටිමං ස්ථිරවම මකනු ඇත."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"කෙටි මං සොයන්න"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"සෙවීම් ප්රතිඵල නැත"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"හැකුළුම් නිරූපකය"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ක්රියාව හෝ Meta යතුරු නිරූපකය"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"ධන නිරූපකය"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"අභිරුචිකරණය කරන්න"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"යළි සකසන්න"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"නිමයි"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"දිගහැරීම් නිරූපකය"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"හෝ"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"යතුරු පුවරු සැකසීම්"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"කෙටිමඟ සකසන්න"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"ඉවත් කරන්න"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ඔව්, යළි සකසන්න"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"අවලංගු කරන්න"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"යතුර ඔබන්න"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"යතුරු සංයෝජනය දැනටමත් භාවිත වේ. වෙනත් යතුරක් උත්සාහ කරන්න."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ඔබේ යතුරු පුවරුවේ ක්රියාකාරී යතුර ඔබන්න"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"හොඳින් කළා!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ඔබ සියලු යෙදුම් ඉංගිත බැලීම සම්පූර්ණ කර ඇත"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"නිබන්ධන සජීවීකරණය, ක්රීඩාව විරාම කිරීමට සහ නැවත ආරම්භ කිරීමට ක්ලික් කරන්න."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"යතුරු පුවරු පසු ආලෝකය"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dන් %1$d වැනි මට්ටම"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"නිවෙස් පාලන"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 0c4880ded520..552b2e362eeb 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -116,7 +116,7 @@ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Pri nahrávaní celej obrazovky sa zaznamená všetko, čo sa na nej zobrazuje. Preto venujte pozornosť položkám, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Pri nahrávaní aplikácie sa zaznamená všetko, čo sa v nej zobrazuje alebo prehráva. Preto venujte pozornosť položkám, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Nahrávať obrazovku"</string> - <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Výber aplikácie na nahrávanie"</string> + <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Vyberte aplikáciu, z ktorej chcete nahrávať"</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Nahrávať zvuk"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk zariadenia"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk zo zariadenia, napríklad hudba, hovory a tóny zvonenia"</string> @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Miniaplikácie"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Ak chcete pridať odkaz Miniaplikácie, uistite sa, že v nastaveniach je zapnutá možnosť Zobrazovať miniaplikácie na uzamknutej obrazovke."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Nastavenia"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Prepnutie používateľa"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rozbaľovacia ponuka"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Všetky aplikácie a údaje v tejto relácii budú odstránené."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Upozornenia"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzácie"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazať všetky tiché upozornenia"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Otvoriť nastavenia upozornení"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Upozornenia sú pozastavené režimom bez vyrušení"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Žiadne upozornenia}=1{Upozornenia boli pozastavené režimom {mode}}=2{Upozornenia boli pozastavené režimom {mode} a jedným ďalším}few{Upozornenia boli pozastavené režimom {mode} a # ďalšími}many{Notifications paused by {mode} and # other modes}other{Upozornenia boli pozastavené režimom {mode} a # ďalšími}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Spustiť"</string> @@ -707,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Sledovanie hlavy"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Režim zvonenia zmeníte klepnutím"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"režim zvonenia"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, režim zvonenia zmeníte klepnutím"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"vypnite zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"zapnite zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"zapnite vibrovanie"</string> @@ -873,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Uzamknutie obrazovky"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Napísanie poznámky"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multitasking"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Rozdeliť obrazovku, aktuálna aplikácia vpravo"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Rozdeliť obrazovku, aktuálna aplikácia vľavo"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prepnutie rozdelenej obrazovky na celú"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Prechod na aplikáciu vpravo alebo dole pri rozdelenej obrazovke"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Prechod na aplikáciu vľavo alebo hore pri rozdelenej obrazovke"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Počas rozdelenej obrazovky: nahradenie aplikácie inou"</string> @@ -1438,8 +1441,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikona akčného klávesa alebo metaklávesa"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikona plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Prispôsobiť"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Resetovať"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Hotovo"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalenia"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"alebo"</string> @@ -1481,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Stlačte na klávesnici akčný kláves"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Dobre!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Použili ste gesto na zobrazenie všetkých aplikácií."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Výuková animácia, kliknutím pozastavíte alebo obnovíte prehrávanie."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvietenie klávesnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. úroveň z %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Ovládanie domácnosti"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index dbeed9d2a37b..33d400ce80cc 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Pripomočki"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Če želite dodati bližnjico »Pripomočki«, v nastavitvah omogočite možnost »Prikaz pripomočkov na zaklenjenem zaslonu«."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Nastavitve"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Pokaži gumb za ohranjevalnik zaslona"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Preklop med uporabniki"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"spustni meni"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Vse aplikacije in podatki v tej seji bodo izbrisani."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Obvestila"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Pogovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Brisanje vseh tihih obvestil"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Odpiranje nastavitev obvestil"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ni obvestil}=1{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode}}=2{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še enim drugim načinom}one{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugim načinom}two{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugima načinoma}few{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugimi načini}other{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugimi načini}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Začni zdaj"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Spremljanje glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dotaknite se, če želite spremeniti način zvonjenja."</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"način zvonjenja"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, dotaknite se, če želite spremeniti način zvonjenja."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"izklop zvoka"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"vklop zvoka"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Zaklepanje zaslona"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Ustvarjanje zapiska"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Večopravilnost"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Uporaba razdeljenega zaslona s trenutno aplikacijo na desni"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Uporaba razdeljenega zaslona s trenutno aplikacijo na levi"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Preklop iz razdeljenega zaslona v celozaslonski način"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Preklop na aplikacijo desno ali spodaj med uporabo razdeljenega zaslona"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Preklop na aplikacijo levo ali zgoraj med uporabo razdeljenega zaslona"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Pri razdeljenem zaslonu: medsebojna zamenjava aplikacij"</string> @@ -1480,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite tipko za dejanja na tipkovnici"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Odlično!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Izvedli ste potezo za ogled vseh aplikacij"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija v vadnici, kliknite za začasno zaustavitev in nadaljevanje predvajanja."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Osvetlitev tipkovnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Stopnja %1$d od %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrolniki za dom"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 743aad0bac97..ce7c9c0f0af7 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Për të hapur një aplikacion duke përdorur një miniaplikacion, do të duhet të verifikosh që je ti. Ki parasysh gjithashtu që çdo person mund t\'i shikojë, edhe kur tableti yt është i kyçur. Disa miniaplikacione mund të mos jenë planifikuar për ekranin tënd të kyçjes dhe mund të mos jetë e sigurt t\'i shtosh këtu."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"E kuptova"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Miniaplikacionet"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Për të shtuar shkurtoren e \"Miniaplikacioneve\", sigurohu që \"Shfaq miniaplikacionet në ekranin e kyçjes\" të jetë aktivizuar te cilësimet."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Cilësimet"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyja me tërheqje poshtë"</string> @@ -709,8 +709,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Ndjekja e lëvizjeve të kokës"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Trokit për të ndryshuar modalitetin e ziles"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"modaliteti i ziles"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Trokit për të ndryshuar modalitetin e ziles"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"çaktivizo audion"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"aktivizo audion"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"lësho dridhje"</string> @@ -875,9 +874,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Ekrani i kyçjes"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Mbaj një shënim"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Kryerja e shumë detyrave"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Përdor ekranin e ndarë me aplikacionin aktual në të djathtë"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Përdor ekranin e ndarë me aplikacionin aktual në të majtë"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Kalo nga ekrani i ndarë në ekranin e plotë"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Kalo tek aplikacioni djathtas ose poshtë kur përdor ekranin e ndarë"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Kalo tek aplikacioni në të majtë ose sipër kur përdor ekranin e ndarë"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Gjatë ekranit të ndarë: zëvendëso një aplikacion me një tjetër"</string> @@ -1430,20 +1432,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Shkurtoret e tastierës"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Personalizo shkurtoret e tastierës"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Të hiqet shkurtorja?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Të rivendosen përsëri te parazgjedhjet?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Shtyp tastin për të caktuar shkurtoren"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Kjo do ta fshijë përgjithmonë shkurtoren tënde të personalizuar."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Kjo do të fshijë përgjithmonë të gjitha shkurtoret e tua të personalizuara."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Kërko për shkurtoret"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Asnjë rezultat kërkimi"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona e palosjes"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Ikona e tastit të veprimit ose tastit Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Ikona e plusit"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Personalizo"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Rivendos"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"U krye"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona e zgjerimit"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ose"</string> @@ -1453,8 +1452,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Cilësimet e tastierës"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Cakto shkurtoren"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Hiq"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Po, rivendosi"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Anulo"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Shtyp tastin"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinimi i tasteve është tashmë në përdorim. Provo një tast tjetër."</string> @@ -1486,8 +1484,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Shtyp tastin e veprimit në tastierë"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Shumë mirë!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Përfundove gjestin për shikimin e të gjitha aplikacioneve"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacioni udhëzues. Kliko për të vendosur në pauzë dhe për të vazhduar luajtjen."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Drita e sfondit e tastierës"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveli: %1$d nga %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrollet e shtëpisë"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 9a15268b9a53..8ae54465d9a7 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Виџети"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Да бисте додали пречицу Виџети, уверите се да је у подешавањима омогућено Приказуј виџете на закључаном екрану."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Подешавања"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Дугме Прикажи чувар екрана"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Замени корисника"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"падајући мени"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Све апликације и подаци у овој сесији ће бити избрисани."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Обавештења"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Конверзације"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Обришите сва нечујна обавештења"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Отворите подешавања обавештења"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Обавештења су паузирана режимом Не узнемиравај"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Нема обавештења}=1{Обавештења је паузирао {mode}}=2{Обавештења су паузирали {mode} и још један режим}one{Обавештења су паузирали {mode} и још # режим}few{Обавештења су паузирали {mode} и још # режима}other{Обавештења су паузирали {mode} и још # режима}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Започни"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Праћење главе"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Додирните да бисте променили режим звона"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"режим звона"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, додирните да бисте променили режим звона"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"искључите звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"укључите звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вибрација"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Откључавање екрана"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Направи белешку"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Обављање више задатака истовремено"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Користи подељени екран са том апликацијом с десне стране"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Користи подељени екран са том апликацијом с леве стране"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пређи са подељеног екрана на цео екран"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Пређи у апликацију здесна или испод док је подељен екран"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Пређите у апликацију слева или изнад док користите подељени екран"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"У режиму подељеног екрана: замена једне апликације другом"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Икона тастера за радњу или мета тастера"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Икона знака плус"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Прилагоди"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Ресетуј"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Готово"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширивање"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Притисните тастер радњи на тастатури"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Одлично!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Довршили сте покрет за приказивање свих апликација."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимација водича, кликните да бисте паузирали и наставили репродукцију."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Позадинско осветљење тастатуре"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. ниво од %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Контроле за дом"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index c8fee613aa23..dcb1955bc87a 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Du måste verifiera din identitet innan du öppnar en app med en widget. Tänk också på att alla kan se dem, även när surfplattan är låst. Vissa widgetar kanske inte är avsedda för låsskärmen och det kan vara osäkert att lägga till dem här."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"OK"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widgetar"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Om du vill lägga till genvägen Widgetar måste du se till att Visa widgetar på låsskärmen är aktiverat i inställningarna."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Inställningar"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Byt användare"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullgardinsmeny"</string> @@ -709,8 +709,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Huvudspårning"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tryck för att ändra ringsignalens läge"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ringsignalläge"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>: Tryck för att ändra ringsignalens läge"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"stänga av ljudet"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"slå på ljudet"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibration"</string> @@ -875,9 +874,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skärmen"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Anteckna"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multikörning"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Anänd delad skärm med den aktuella appen till höger"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Använd delad skärm med den aktuella appen till vänster"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Byt mellan delad skärm och helskärm"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Byt till appen till höger eller nedanför när du använder delad skärm"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Byt till appen till vänster eller ovanför när du använder delad skärm"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Med delad skärm: ersätt en app med en annan"</string> @@ -1430,12 +1432,10 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Kortkommandon"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Anpassa kortkommandon"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Vill du ta bort kortkommandot?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vill du återställa till standardinställningarna?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tryck på tangenten för att tilldela ett kortkommando"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Det anpassade kortkommandot raderas permanent."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Alla anpassade genvägar raderas permanent."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Sökgenvägar"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Inga sökresultat"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikonen Komprimera"</string> @@ -1452,8 +1452,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Tangentbordsinställningar"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Ange kortkommando"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Ta bort"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, återställ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Avbryt"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tryck på tangenten"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tangentkombinationen används redan. Testa en annan tangent."</string> @@ -1485,8 +1484,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tryck på åtgärdstangenten på tangentbordet"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bra gjort!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du är klar med rörelsen för att se alla apparna."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation för guiden: Klicka för att pausa och återuppta uppspelningen."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrundsbelysning för tangentbord"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Hemstyrning"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 44bac9223969..cd2c448716ff 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Utahitaji kuthibitisha kuwa ni wewe ili ufungue programu ukitumia wijeti. Pia, kumbuka kuwa mtu yeyote anaweza kuziona, hata kishikwambi chako kikiwa kimefungwa. Huenda baadhi ya wijeti hazikukusudiwa kutumika kwenye skrini yako iliyofungwa na huenda si salama kuziweka hapa."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Nimeelewa"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Wijeti"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Ili uweke njia ya mkato ya \"Wijeti\", hakikisha kuwa kitufe cha \"Onyesha wijeti kwenye skrini iliyofungwa\" kimewashwa katika mipangilio."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Mipangilio"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Badili mtumiaji"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyu ya kuvuta chini"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Arifa"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Mazungumzo"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Futa arifa zote zisizo na sauti"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Fungua mipangilio ya arifa"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kipengele cha Usinisumbue kimesitisha arifa"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Hakuna arifa}=1{Arifa zimesitishwa na {mode}}=2{Arifa zimesitishwa na {mode} na hali nyingine moja}other{Arifa zimesitishwa na {mode} na hali nyingine #}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Anza sasa"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Ufuatilizi wa Kichwa"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Gusa ili ubadilishe hali ya programu inayotoa milio ya simu"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"hali ya programu inayotoa milio ya simu"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, gusa ili ubadilishe hali ya programu inayotoa milio ya simu"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"zima sauti"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"washa sauti"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"tetema"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Funga skrini"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Andika dokezo"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Majukumu mengi"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Tumia hali ya kugawa skrini na programu ya sasa iwe upande wa kulia"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Tumia hali ya kugawa skrini na programu ya sasa iwe upande wa kushoto"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Badilisha kutoka skrini iliyogawanywa utumie skrini nzima"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Badilisha ili uende kwenye programu iliyo kulia au chini unapotumia hali ya kugawa skrini"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Badilisha uende kwenye programu iliyo kushoto au juu unapotumia hali ya kugawa skrini"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Ukigawanya skrini: badilisha kutoka programu moja hadi nyingine"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Mikato ya kibodi"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Weka mapendeleo ya mikato ya kibodi"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Ungependa kuondoa njia ya mkato?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Ungependa kurejesha njia za mkato chaguomsingi?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Bonyeza kitufe ukabidhi njia ya mkato"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Hatua hii itaondoa kabisa njia yako maalum ya mkato."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Hatua hii itafuta kabisa njia zako zote maalum za mkato."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Njia mkato za kutafutia"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Hamna matokeo ya utafutaji"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kunja aikoni"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Aikoni ya kitufe cha Vitendo au cha Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Aikoni ya alama ya kujumlisha"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Weka mapendeleo"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Weka upya"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Nimemaliza"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Panua aikoni"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"au"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Mipangilio ya Kibodi"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Weka njia ya mkato"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Ondoa"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ndiyo, rejesha"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Acha"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Bonyeza kitufe"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tayari unatumia mchanganyiko wa vitufe. Jaribu kitufe kingine."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Bonyeza kitufe cha vitendo kwenye kibodi yako"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Vizuri sana!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Umekamilisha mafunzo ya mguso wa kuangalia programu zote"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Uhuishaji wa mafunzo, bofya ili usitishe na uendelee kucheza."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Mwanga chini ya kibodi"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Kiwango cha %1$d kati ya %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Dhibiti Vifaa Nyumbani"</string> diff --git a/packages/SystemUI/res/values-sw600dp-land/styles.xml b/packages/SystemUI/res/values-sw600dp-land/styles.xml index cde1a1373bed..45698f78d03a 100644 --- a/packages/SystemUI/res/values-sw600dp-land/styles.xml +++ b/packages/SystemUI/res/values-sw600dp-land/styles.xml @@ -22,20 +22,20 @@ <item name="android:layout_marginTop">16dp</item> <item name="android:textSize">36sp</item> <item name="android:focusable">true</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Subtitle"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">16dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Description"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">16dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> </resources> diff --git a/packages/SystemUI/res/values-sw600dp-port/styles.xml b/packages/SystemUI/res/values-sw600dp-port/styles.xml index 85e7af6ee1de..8b3e6fde0b74 100644 --- a/packages/SystemUI/res/values-sw600dp-port/styles.xml +++ b/packages/SystemUI/res/values-sw600dp-port/styles.xml @@ -30,7 +30,7 @@ <item name="android:layout_marginTop">24dp</item> <item name="android:textSize">36sp</item> <item name="android:focusable">true</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> </resources> diff --git a/packages/SystemUI/res/values-sw720dp-land/styles.xml b/packages/SystemUI/res/values-sw720dp-land/styles.xml index e75173d152b0..451a9a901cce 100644 --- a/packages/SystemUI/res/values-sw720dp-land/styles.xml +++ b/packages/SystemUI/res/values-sw720dp-land/styles.xml @@ -22,21 +22,21 @@ <item name="android:layout_marginTop">16dp</item> <item name="android:textSize">36sp</item> <item name="android:focusable">true</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Subtitle"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">16dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Description"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">16dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> </resources> diff --git a/packages/SystemUI/res/values-sw720dp-port/styles.xml b/packages/SystemUI/res/values-sw720dp-port/styles.xml index 85e7af6ee1de..8b3e6fde0b74 100644 --- a/packages/SystemUI/res/values-sw720dp-port/styles.xml +++ b/packages/SystemUI/res/values-sw720dp-port/styles.xml @@ -30,7 +30,7 @@ <item name="android:layout_marginTop">24dp</item> <item name="android:textSize">36sp</item> <item name="android:focusable">true</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 4c650958eeb1..ce630bbc1f1a 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"விட்ஜெட்டைப் பயன்படுத்தி ஆப்ஸைத் திறக்க, அது நீங்கள்தான் என்பதை உறுதிசெய்ய வேண்டும். அத்துடன், உங்கள் டேப்லெட் பூட்டப்பட்டிருந்தாலும்கூட அவற்றை யார் வேண்டுமானாலும் பார்க்கலாம் என்பதை நினைவில்கொள்ளுங்கள். சில விட்ஜெட்கள் உங்கள் பூட்டுத் திரைக்காக உருவாக்கப்பட்டவை அல்ல என்பதையும் அவற்றை இங்கே சேர்ப்பது பாதுகாப்பற்றதாக இருக்கக்கூடும் என்பதையும் நினைவில்கொள்ளுங்கள்."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"சரி"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"விட்ஜெட்கள்"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"“விட்ஜெட்கள்” ஷார்ட்கட்டைச் சேர்க்க, அமைப்புகளில் “பூட்டுத் திரையில் விட்ஜெட்களைக் காட்டுதல்” அமைப்பு இயக்கப்பட்டிருப்பதை உறுதிசெய்துகொள்ளுங்கள்."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"அமைப்புகள்"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"பயனரை மாற்று"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"கீழ் இழுக்கும் மெனு"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"அறிவிப்புகள்"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"உரையாடல்கள்"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"சைலன்ட் அறிவிப்புகள் அனைத்தையும் அழிக்கும்"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"அறிவிப்பு அமைப்புகளைத் திறக்கும்"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{அறிவிப்புகள் இல்லை}=1{{mode} பயன்முறையால் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன}=2{{mode} மற்றும் வேறொரு பயன்முறையால் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன}other{{mode} மற்றும் வேறு # பயன்முறைகளால் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"இப்போது தொடங்கு"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ஹெட் டிராக்கிங்"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ரிங்கர் பயன்முறையை மாற்ற தட்டவும்"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ரிங்கர் பயன்முறை"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ரிங்கர் பயன்முறையை மாற்ற தட்டலாம்"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ஒலியடக்கும்"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ஒலி இயக்கும்"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"அதிர்வுறும்"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"பூட்டுத் திரை"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"குறிப்பெடுத்தல்"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"பல வேலைகளைச் செய்தல்"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"தற்போது உள்ள ஆப்ஸ் வலதுபுறம் வரும்படி திரைப் பிரிப்பைப் பயன்படுத்துதல்"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"தற்போது உள்ள ஆப்ஸ் இடதுபுறம் வரும்படி திரைப் பிரிப்பைப் பயன்படுத்துதல்"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"திரைப் பிரிப்பு பயன்முறையிலிருந்து முழுத்திரைக்கு மாற்றுதல்"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"திரைப் பிரிப்பைப் பயன்படுத்தும்போது வலது/கீழ் உள்ள ஆப்ஸுக்கு மாறுதல்"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"திரைப் பிரிப்பைப் பயன்படுத்தும்போது இடது/மேலே உள்ள ஆப்ஸுக்கு மாறுதல்"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"கீபோர்டு ஷார்ட்கட்கள்"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"கீபோர்டு ஷார்ட்கட்களைப் பிரத்தியேகப்படுத்துதல்"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ஷார்ட்கட்டை அகற்றவா?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"மீண்டும் இயல்புநிலைக்கு மீட்டமைக்கவா?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ஷார்ட்கட்டை அமைக்க பட்டனை அழுத்துங்கள்"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"இது உங்கள் பிரத்தியேக ஷார்ட்கட்டை நிரந்தரமாக நீக்கும்."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"இது உங்கள் பிரத்தியேக ஷார்ட்கட்கள் அனைத்தையும் நிரந்தரமாக நீக்கும்."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ஷார்ட்கட்களைத் தேடுக"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"தேடல் முடிவுகள் இல்லை"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"சுருக்குவதற்கான ஐகான்"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ஆக்ஷன்/மெட்டா பட்டன் ஐகான்"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"பிளஸ் ஐகான்"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"பிரத்தியேகப்படுத்தும்"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"மீட்டமை"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"முடிந்தது"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"விரிவாக்குவதற்கான ஐகான்"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"அல்லது"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"கீபோர்டு அமைப்புகள்"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"ஷார்ட்கட்டை அமையுங்கள்"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"அகற்று"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ஆம். மீட்டமை"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ரத்துசெய்"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"பட்டனை அழுத்துங்கள்"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"பட்டன் சேர்க்கை ஏற்கெனவே பயன்பாட்டில் உள்ளது. வேறொரு பட்டனைப் பயன்படுத்திப் பார்க்கவும்."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"உங்கள் கீபோர்டில் ஆக்ஷன் பட்டனை அழுத்தவும்"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"அருமை!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"அனைத்து ஆப்ஸையும் பார்ப்பதற்கான சைகை பயிற்சியை நிறைவுசெய்துவிட்டீர்கள்"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"பயிற்சி அனிமேஷன், இடைநிறுத்தவும் மீண்டும் இயக்கவும் கிளிக் செய்யலாம்."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"கீபோர்டு பேக்லைட்"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"நிலை, %2$d இல் %1$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ஹோம் கன்ட்ரோல்கள்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index ebed1877810b..20d4cf766d58 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"విడ్జెట్లు"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"విడ్జెట్ల\" షార్ట్కట్ను జోడించడానికి, సెట్టింగ్లలో \"లాక్ స్క్రీన్లో విడ్జెట్లను చూపండి\" అనే ఆప్షన్ను ఎనేబుల్ చేసినట్లు నిర్ధారించుకోండి."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"సెట్టింగ్లు"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"స్క్రీన్ సేవర్ బటన్ను చూపండి"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"వినియోగదారుని మార్చు"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"పుల్డౌన్ మెనూ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ఈ సెషన్లోని అన్ని యాప్లు మరియు డేటా తొలగించబడతాయి."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"నోటిఫికేషన్లు"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"సంభాషణలు"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"అన్ని నిశ్శబ్ద నోటిఫికేషన్లను క్లియర్ చేస్తుంది"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"నోటిఫికేషన్ల సెట్టింగ్లను తెరవండి"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్లు పాజ్ చేయబడ్డాయి"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{నోటిఫికేషన్లు ఏవీ లేవు}=1{{mode} ద్వారా నోటిఫికేషన్లు పాజ్ చేయబడ్డాయి}=2{నోటిఫికేషన్లు, {mode}, మరో ఒక మోడ్ ద్వారా పాజ్ చేయబడ్డాయి}other{నోటిఫికేషన్లు, {mode}, మరో # మోడ్ల ద్వారా పాజ్ చేయబడ్డాయి}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ఇప్పుడే ప్రారంభించండి"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"హెడ్ ట్రాకింగ్"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"రింగర్ మోడ్ను మార్చడానికి ట్యాప్ చేయండి"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"రింగర్ మోడ్"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, రింగర్ మోడ్ను మార్చడానికి ట్యాప్ చేయండి"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"మ్యూట్ చేయి"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"అన్మ్యూట్ చేయి"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"వైబ్రేట్"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"లాక్ స్క్రీన్"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"నోట్ను రాయండి"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"మల్టీ-టాస్కింగ్"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"కుడివైపు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఉపయోగించండి"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ఎడమవైపు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఉపయోగించండి"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"స్ప్లిట్ స్క్రీన్ను ఫుల్ స్క్రీన్కు మార్చండి"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు కుడి లేదా కింద యాప్నకు మారండి"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు ఎడమ లేదా పైన యాప్నకు మారండి"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"స్ప్లిట్ స్క్రీన్ సమయంలో: ఒక దాన్నుండి మరో దానికి యాప్ రీప్లేస్ చేయండి"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"యాక్షన్ లేదా మెటా కీ చిహ్నం"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"ప్లస్ చిహ్నం"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"అనుకూలంగా మార్చండి"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"రీసెట్ చేయండి"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"పూర్తయింది"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"విస్తరించండి చిహ్నం"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"లేదా"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"మీ కీబోర్డ్లో యాక్షన్ కీని నొక్కండి"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"చక్కగా చేశారు!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"అన్ని యాప్లను చూడడానికి ఉపయోగించే సంజ్ఞకు సంబంధించిన ట్యుటోరియల్ను మీరు పూర్తి చేశారు"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ట్యుటోరియల్ యానిమేషన్, పాజ్ చేసి, మళ్లీ ప్లే చేయడానికి క్లిక్ చేయండి."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"కీబోర్డ్ బ్యాక్లైట్"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dలో %1$dవ స్థాయి"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"హోమ్ కంట్రోల్స్"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index fe13888c2ead..d438e4457778 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"วิดเจ็ต"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"หากต้องการเพิ่มทางลัด \"วิดเจ็ต\" โปรดตรวจสอบว่าได้เปิดใช้ \"แสดงวิดเจ็ตในหน้าจอล็อก\" แล้วในการตั้งค่า"</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"การตั้งค่า"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"ปุ่มแสดงภาพพักหน้าจอ"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"สลับผู้ใช้"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"เมนูแบบเลื่อนลง"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ระบบจะลบแอปและข้อมูลทั้งหมดในเซสชันนี้"</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"การแจ้งเตือน"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ล้างการแจ้งเตือนแบบไม่มีเสียงทั้งหมด"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"เปิดการตั้งค่าการแจ้งเตือน"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\""</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ไม่มีการแจ้งเตือน}=1{หยุดการแจ้งเตือนชั่วคราวโดย {mode}}=2{หยุดการแจ้งเตือนชั่วคราวโดย {mode} และโหมดอื่นอีก 1 โหมด}other{หยุดการแจ้งเตือนชั่วคราวโดย {mode} และโหมดอื่นอีก # โหมด}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"เริ่มเลย"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"การติดตามการเคลื่อนไหวของศีรษะ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"แตะเพื่อเปลี่ยนโหมดเสียงเรียกเข้า"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"โหมดเสียงเรียกเข้า"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g> แตะเพื่อเปลี่ยนโหมดเสียงเรียกเข้า"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ปิดเสียง"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"เปิดเสียง"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"สั่น"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"ล็อกหน้าจอ"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"จดโน้ต"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"การทํางานหลายอย่างพร้อมกัน"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"ใช้โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านขวา"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"ใช้โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านซ้าย"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"เปลี่ยนจากโหมดแยกหน้าจอเป็นเต็มหน้าจอ"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"เปลี่ยนไปใช้แอปทางด้านขวาหรือด้านล่างขณะใช้โหมดแยกหน้าจอ"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"เปลี่ยนไปใช้แอปทางด้านซ้ายหรือด้านบนขณะใช้โหมดแยกหน้าจอ"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"ไอคอนการดำเนินการหรือแป้น Meta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"ไอคอนเครื่องหมายบวก"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"ปรับแต่ง"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"รีเซ็ต"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"เสร็จสิ้น"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ไอคอนขยาย"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"หรือ"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"กดปุ่มดำเนินการบนแป้นพิมพ์"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ยอดเยี่ยม"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"คุณทำท่าทางสัมผัสเพื่อดูแอปทั้งหมดสำเร็จแล้ว"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ภาพเคลื่อนไหวของบทแนะนำ คลิกเพื่อหยุดชั่วคราวและเล่นต่อ"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ไฟแบ็กไลต์ของแป้นพิมพ์"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"ระดับที่ %1$d จาก %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ระบบควบคุมอุปกรณ์สมาร์ทโฮม"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 9d794249b11a..ee152600a3e5 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Mga Widget"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Para idagdag ang shortcut na \"Mga Widget,\" tiyaking naka-enable ang \"Ipakita ang mga widget sa lock screen\" sa mga setting."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Mga Setting"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"Button na ipakita ang screensaver"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Magpalit ng user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Ide-delete ang lahat ng app at data sa session na ito."</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Mga Notification"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Mga Pag-uusap"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"I-clear ang lahat ng silent na notification"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Buksan ang mga setting ng notification"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Mga notification na na-pause ng Huwag Istorbohin"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Walang notification}=1{Na-pause ng {mode} ang mga notification}=2{Na-pause ng {mode} at isa pang mode ang mga notification}one{Na-pause ng {mode} at # pang mode ang mga notification}other{Na-pause ng {mode} at # pang mode ang mga notification}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Magsimula ngayon"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pag-track ng Ulo"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"I-tap para baguhin ang ringer mode"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"ringer mode"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, i-tap para baguhin ang ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"i-mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"i-unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"i-vibrate"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"I-lock ang screen"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Magtala"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Pag-multitask"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Gumamit ng split screen nang nasa kanan ang kasalukuyang app"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Gumamit ng split screen nang nasa kaliwa ang kasalukuyang app"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Lumipat sa full screen mula sa split screen"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Lumipat sa app sa kanan o ibaba habang ginagamit ang split screen"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Lumipat sa app sa kaliwa o itaas habang ginagamit ang split screen"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Habang nasa split screen: magpalit-palit ng app"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icon ng Action o Meta key"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Icon na plus"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"I-customize"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"I-reset"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Tapos na"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"I-expand ang icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pindutin ang action key sa iyong keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Magaling!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Nakumpleto mo ang galaw sa pag-view ng lahat ng app"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation ng tutorial, i-click para i-pause at ipagpatuloy ang paglalaro."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Backlight ng keyboard"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d sa %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Mga Home Control"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 046d973e30ff..c12f7b6ea7d7 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Widget kullanarak bir uygulamayı açmak için kimliğinizi doğrulamanız gerekir. Ayrıca, tabletiniz kilitliyken bile widget\'ların herkes tarafından görüntülenebileceğini unutmayın. Bazı widget\'lar kilit ekranınız için tasarlanmamış olabileceğinden buraya eklenmeleri güvenli olmayabilir."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Anladım"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Widget\'lar"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"Widget\'lar\" kısayolunu eklemek için ayarlarda \"Widget\'ları kilit ekranında göster\" seçeneğinin etkinleştirildiğinden emin olun."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Ayarlar"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kullanıcı değiştirme"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"açılır menü"</string> @@ -709,8 +709,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Baş Takibi"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Telefon zili modunu değiştirmek için dokunun"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"telefon zili modu"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, telefon zili modunu değiştirmek için dokunun"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"sesi kapat"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"sesi aç"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"titreşim"</string> @@ -875,9 +874,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Kilit ekranı"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Not al"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Çoklu görev"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Sağdaki mevcut uygulamayla birlikte bölünmüş ekranı kullan"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Soldaki mevcut uygulamayla birlikte bölünmüş ekranı kullan"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana geç"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bölünmüş ekran kullanırken sağdaki veya alttaki uygulamaya geçiş yap"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bölünmüş ekran kullanırken soldaki veya üstteki uygulamaya geçiş yapın"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştir"</string> @@ -1430,20 +1432,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Klavye kısayolları"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Klavye kısayollarını özelleştirin"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Kısayol kaldırılsın mı?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Varsayılan kısayollara sıfırlansın mı?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Kısayol atamak için tuşa basın"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Bu işlem, özel kısayolunuzu kalıcı olarak siler."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Bu işlem, tüm özel kısayollarınızı kalıcı olarak siler."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Arama kısayolları"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Arama sonucu yok"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Daralt simgesi"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"İşlem veya Meta tuşu simgesi"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Artı simgesi"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Özelleştir"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Sıfırla"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Bitti"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Genişlet simgesi"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"veya"</string> @@ -1453,8 +1452,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Klavye Ayarları"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Kısayol ayarla"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Kaldır"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Evet, sıfırlansın"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"İptal"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tuşa basın"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tuş kombinasyonu zaten kullanılıyor. Başka bir tuş deneyin."</string> @@ -1486,8 +1484,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Klavyenizde eylem tuşuna basın"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Tebrikler!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Tüm uygulamaları görüntüleme hareketini tamamladınız"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Eğitim animasyonu, oynatmayı duraklatmak ve sürdürmek için tıklayın."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klavye aydınlatması"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Seviye %1$d / %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Ev Kontrolleri"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index a414824d129a..c2c3c61a49c7 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Щоб відкрити додаток за допомогою віджета, вам потрібно буде підтвердити особу. Пам’ятайте також, що бачити віджети можуть усі, навіть коли планшет заблоковано. Можливо, деякі віджети не призначені для заблокованого екрана, і додавати їх на нього може бути небезпечно."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"OK"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Віджети"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Щоб додати ярлик \"Віджети\", переконайтеся, що в налаштуваннях увімкнено опцію \"Показувати віджети на заблокованому екрані\"."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Налаштування"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Змінити користувача"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"спадне меню"</string> @@ -709,8 +709,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Відстеження рухів голови"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Торкніться, щоб змінити режим дзвінка"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"режим дзвінка"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>. Натисніть, щоб змінити режим дзвінка."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"вимкнути звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"увімкнути звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"увімкнути вібросигнал"</string> @@ -875,9 +874,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокувати екран"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Створити нотатку"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Багатозадачність"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Розділити екран і показувати поточний додаток праворуч"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Розділити екран і показувати поточний додаток ліворуч"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Перейти з розділення екрана на весь екран"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Перейти до додатка праворуч або внизу на розділеному екрані"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Під час розділення екрана перемикатися на додаток ліворуч або вгорі"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Під час розділення екрана: замінити додаток іншим"</string> @@ -1430,20 +1432,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Комбінації клавіш"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Налаштуйте комбінації клавіш"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Видалити комбінацію клавіш?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Відновити комбінації клавіш за умовчанням?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Натисніть клавішу, щоб призначити комбінацію клавіш"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Вашу власну комбінацію клавіш буде видалено назавжди."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Усі ваші власні комбінації клавіш буде видалено назавжди."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Комбінації клавіш для пошуку"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Нічого не знайдено"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок згортання"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Значок клавіші дії або метаклавіші"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Значок \"плюс\""</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Налаштувати"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Скинути"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Готово"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок розгортання"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string> @@ -1453,8 +1452,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Налаштування клавіатури"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Налаштувати комбінацію клавіш"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Видалити"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Так, відновити"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Скасувати"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Натисніть клавішу"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Комбінація клавіш уже використовується. Спробуйте іншу клавішу."</string> @@ -1486,8 +1484,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Натисніть клавішу дії на клавіатурі"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Чудово!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Ви виконали жест для перегляду всіх додатків"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Навчальна анімація. Натисніть, щоб призупинити або відновити відтворення."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Підсвічування клавіатури"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Рівень %1$d з %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Автоматизація дому"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 2980b2fbe0f0..8b3b9a026fe8 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"ویجیٹس"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"\"ویجیٹس\" شارٹ کٹ شامل کرنے کے لیے، یقینی بنائیں کہ \"مقفل اسکرین پر ویجیٹس دکھائیں\" ترتیبات میں فعال ہے۔"</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"ترتیبات"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"اسکرین سیور بٹن دکھائیں"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"صارف سوئچ کریں"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"پل ڈاؤن مینیو"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"اس سیشن میں موجود سبھی ایپس اور ڈیٹا کو حذف کر دیا جائے گا۔"</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"اطلاعات"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"گفتگوئیں"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"سبھی خاموش اطلاعات کو صاف کریں"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"اطلاعات کی ترتیبات کھولیں"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{کوئی اطلاع نہیں ہے}=1{{mode} کی طرف سے اطلاعات کو روک دیا گیا ہے}=2{{mode} اور ایک دوسرے موڈ کے ذریعہ اطلاعات کو روک دیا گیا ہے}other{{mode} اور # دیگر طریقوں کے ذریعے اطلاعات کو روک دیا گیا ہے}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ابھی شروع کریں"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"سر کی ٹریکنگ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"رنگر وضع تبدیل کرنے کیلئے تھپتھپائیں"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"رنگر موڈ"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"رنگر وضع تبدیل کرنے کیلئے <xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g> تھپتھپائیں"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"خاموش کریں"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"غیر خاموش کریں"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"وائبریٹ"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"اسکرین لاک کریں"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"نوٹ لیں"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"ملٹی ٹاسکنگ"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"دائیں جانب موجودہ ایپ کے ساتھ اسپلٹ اسکرین کا استعمال کریں"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"بائیں جانب موجودہ ایپ کے ساتھ اسپلٹ اسکرین کا استعمال کریں"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"اسپلٹ اسکرین سے پوری سکرین پر سوئچ کریں"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"اسپلٹ اسکرین کا استعمال کرتے ہوئے دائیں یا نیچے ایپ پر سوئچ کریں"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"اسپلٹ اسکرین کا استعمال کرتے ہوئے بائیں یا اوپر ایپ پر سوئچ کریں"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"کارروائی یا Meta کلید کا آئیکن"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"پلس کا آئیکن"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"حسب ضرورت بنائیں"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"ری سیٹ کریں"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"ہو گیا"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"آئیکن پھیلائیں"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"اپنے کی بورڈ پر ایکشن کلید دبائیں"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"بہت خوب!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"آپ نے سبھی ایپس دیکھیں کا اشارہ مکمل کر لیا ہے"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ٹیوٹوریل اینیمیشن، روکنے کے لیے کلک کریں اور چلانا دوبارہ شروع کریں۔"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"کی بورڈ بیک لائٹ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d میں سے %1$d کا لیول"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"ہوم کنٹرولز"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 9057926d4cb3..dc01a492356d 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -531,6 +531,8 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Vidjetlar"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"“Vidjetlar” yorligʻini qoʻshish uchun sozlamalarda “Vidjetlarni ekran qulfida chiqarish” yoqilganini tekshiring."</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Sozlamalar"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> + <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Foydalanuvchini almashtirish"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"tortib tushiriladigan menyu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Ushbu seansdagi barcha ilovalar va ma’lumotlar o‘chirib tashlanadi."</string> @@ -591,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Bildirishnomalar"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Barcha sokin bildirishnomalarni tozalash"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Bildirishnoma sozlamalarini ochish"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilinadi"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Bildirishnomalar yoʻq}=1{{mode} rejimi bildirishnomalarni pauza qilgan}=2{{mode} va yana bitta boshqa rejim bildirishnomalarni pauza qilgan}other{{mode} va # ta boshqa rejim bildirishnomalarni pauza qilgan}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Boshlash"</string> @@ -872,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Ekran qulfi"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Qayd yaratish"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Multi-vazifalilik"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Ekranni ajratib, joriy ilovani oʻngga joylash"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Ekranni ajratib, joriy ilovani chapga joylash"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Ajratilgan ekran rejimidan butun ekranga almashtirish"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ajratilgan ekranda oʻngdagi yoki pastdagi ilovaga almashish"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ajratilgan ekranda chapdagi yoki yuqoridagi ilovaga almashish"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Ajratilgan rejimda ilovalarni oʻzaro almashtirish"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 6c7c5f66410f..1dd604273d00 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Để dùng tiện ích mở một ứng dụng, bạn cần xác minh danh tính của mình. Ngoài ra, hãy lưu ý rằng bất kỳ ai cũng có thể xem các tiện ích này, ngay cả khi máy tính bảng của bạn được khoá. Một số tiện ích có thể không dành cho màn hình khoá và không an toàn khi thêm vào đây."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Tôi hiểu"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Tiện ích"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Để thêm phím tắt \"Tiện ích\", hãy nhớ bật tuỳ chọn \"Hiện tiện ích trên màn hình khoá\" trong phần cài đặt."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Cài đặt"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Chuyển đổi người dùng"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"trình đơn kéo xuống"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"Thông báo"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Xóa tất cả thông báo im lặng"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"Mở phần cài đặt thông báo"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Chế độ Không làm phiền đã tạm dừng thông báo"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Không có thông báo}=1{{mode} đã tạm dừng thông báo}=2{{mode} và một chế độ khác đã tạm dừng thông báo}other{{mode} và # chế độ khác đã tạm dừng thông báo}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Bắt đầu ngay"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Theo dõi chuyển động của đầu"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Nhấn để thay đổi chế độ chuông"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"chế độ chuông"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, nhấn để thay đổi chế độ chuông"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"tắt tiếng"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"bật tiếng"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"rung"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Màn hình khoá"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Tạo ghi chú"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Đa nhiệm"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Dùng tính năng chia đôi màn hình, trong đó ứng dụng hiện tại ở bên phải"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Dùng tính năng chia đôi màn hình, trong đó ứng dụng hiện tại ở bên trái"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Chuyển từ chế độ chia đôi màn hình sang chế độ toàn màn hình"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Chuyển sang ứng dụng bên phải hoặc ở dưới khi đang chia đôi màn hình"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Chuyển sang ứng dụng bên trái hoặc ở trên khi đang chia đôi màn hình"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Trong chế độ chia đôi màn hình: thay một ứng dụng bằng ứng dụng khác"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Phím tắt"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Tuỳ chỉnh phím tắt"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Xoá lối tắt?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Đặt lại về phím tắt mặc định?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Nhấn phím để chỉ định lối tắt"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Thao tác này sẽ xoá vĩnh viễn lối tắt tuỳ chỉnh của bạn."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Thao tác này sẽ xoá vĩnh viễn mọi phím tắt tuỳ chỉnh của bạn."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Tìm lối tắt"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Không có kết quả tìm kiếm nào"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Biểu tượng Thu gọn"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Biểu tượng phím Meta (phím hành động)"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Biểu tượng dấu cộng"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Tuỳ chỉnh"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Đặt lại"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Xong"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Biểu tượng Mở rộng"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"hoặc"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Cài đặt bàn phím"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Đặt phím tắt"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Xoá"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Có, đặt lại"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Huỷ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Nhấn phím"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tổ hợp phím đã được sử dụng. Hãy thử một phím khác."</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Nhấn phím hành động trên bàn phím"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Rất tốt!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Bạn đã hoàn tất cử chỉ xem tất cả các ứng dụng"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Ảnh động trong phần hướng dẫn, nhấp để tạm dừng và tiếp tục phát."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Đèn nền bàn phím"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Độ sáng %1$d/%2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Điều khiển nhà"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index d37fe903da0b..e18fcec9f897 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -531,6 +531,7 @@ <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"微件"</string> <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"如要添加“微件”快捷方式,请确保已在设置中启用“在锁屏状态下显示微件”。"</string> <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"设置"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"“显示屏保”按钮"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切换用户"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉菜单"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"此会话中的所有应用和数据都将被删除。"</string> @@ -591,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有静音通知"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"打开通知设置"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{无通知}=1{{mode}暂停了通知}=2{{mode}和另外 1 种模式暂停了通知}other{{mode}和另外 # 种模式暂停了通知}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string> @@ -707,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"头部跟踪"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"点按即可更改振铃器模式"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"响铃模式"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>,点按即可更改响铃模式"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"静音"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"取消静音"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"振动"</string> @@ -873,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"锁定屏幕"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"添加记事"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"多任务处理"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"使用分屏模式,并将当前应用置于右侧"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"使用分屏模式,并将当前应用置于左侧"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"从分屏模式切换为全屏"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分屏模式时,切换到右侧或下方的应用"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分屏模式时,切换到左侧或上方的应用"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"在分屏期间:将一个应用替换为另一个应用"</string> @@ -1438,8 +1440,7 @@ <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"操作键或元键图标"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"加号图标"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"自定义"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"重置"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"完成"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展开图标"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> @@ -1481,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"按键盘上的快捷操作按键"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"非常棒!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"您已完成“查看所有应用”手势教程"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"教程动画,点击可暂停和继续播放。"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"键盘背光"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 级,共 %2$d 级"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"家居控制"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 9b16360bbf02..871bd31bbbd3 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -529,10 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"如要使用小工具開啟應用程式,系統會要求你驗證身分。請注意,所有人都能查看小工具,即使平板電腦已鎖定亦然。部分小工具可能不適用於上鎖畫面,新增至這裡可能會有安全疑慮。"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"知道了"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"小工具"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> - <skip /> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"如要新增「小工具」捷徑,請確保在設定中已啟用「在上鎖畫面顯示小工具」。"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"設定"</string> + <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"顯示螢幕保護程式按鈕"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會被刪除。"</string> @@ -593,8 +592,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"打開通知設定"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「請勿騷擾」模式已將通知暫停"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{沒有通知}=1{{mode}已暫停通知}=2{{mode}和另外一個模式已暫停通知}other{{mode}和另外 # 個模式已暫停通知}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string> @@ -709,8 +707,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"頭部追蹤"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"輕按即可變更響鈴模式"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"響鈴模式"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>,輕按以變更響鈴模式"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"靜音"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"取消靜音"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"震動"</string> @@ -875,9 +872,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"上鎖畫面"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"寫筆記"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"多工處理"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"使用分割螢幕,並在右側顯示目前使用的應用程式"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"使用分割螢幕,並在左側顯示目前使用的應用程式"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"將分割螢幕切換為全螢幕"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分割螢幕時,切換至右邊或下方的應用程式"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分割螢幕時,切換至左邊或上方的應用程式"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割螢幕期間:更換應用程式"</string> @@ -1430,20 +1430,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"鍵盤快速鍵"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"自訂鍵盤快速鍵"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"要移除快速鍵嗎?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"要重設至預設捷徑嗎?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"按鍵即可指派快速鍵"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"這將永久刪除你的自訂快速鍵。"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"這將永久刪除你的所有自訂捷徑。"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"搜尋快速鍵"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"沒有相符的搜尋結果"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"快捷操作鍵或修飾鍵圖示"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"加號圖示"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"自訂"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"重設"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"完成"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> @@ -1453,8 +1450,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"鍵盤設定"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"設定快速鍵"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"移除"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"是,請重設"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"取消"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"按鍵"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"此按鍵組合已在使用,請改用其他按鍵。"</string> @@ -1486,8 +1482,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"按下鍵盤上的快捷操作鍵"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"做得好!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"你已完成「查看所有應用程式」手勢的教學課程"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"教學動畫,按一下以暫停和繼續播放。"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"智能家居"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 49111ea40f9d..334117540509 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"如要使用小工具開啟應用程式,需先驗證身分。請留意,即使平板電腦已鎖定,所有人都還是能查看小工具。某些小工具可能不適用於螢幕鎖定畫面,新增到此可能會有安全疑慮。"</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"我知道了"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"小工具"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"如要新增「小工具」捷徑,請務必前往設定啟用「在螢幕鎖定畫面上顯示小工具」。"</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"設定"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string> @@ -593,8 +593,7 @@ <string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string> - <!-- no translation found for accessibility_notification_section_header_open_settings (6235202417954844004) --> - <skip /> + <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"開啟通知設定"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「零打擾」模式已將通知設為暫停"</string> <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{沒有通知}=1{「{mode}」模式已將通知設為暫停}=2{「{mode}」和另一個模式已將通知設為暫停}other{「{mode}」和另外 # 個模式已將通知設為暫停}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string> @@ -709,8 +708,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"頭部追蹤"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"輕觸即可變更鈴聲模式"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"鈴聲模式"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>,輕觸即可變更鈴聲模式"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"靜音"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"取消靜音"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"震動"</string> @@ -875,9 +873,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"螢幕鎖定"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"新增記事"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"多工處理"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"使用分割畫面,並在右側顯示目前使用的應用程式"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"使用分割畫面,並在左側顯示目前使用的應用程式"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"從分割畫面切換到完整畫面"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分割畫面時,切換到右邊或上方的應用程式"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分割畫面時,切換到左邊或上方的應用程式"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割畫面期間:更換應用程式"</string> @@ -1430,20 +1431,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"鍵盤快速鍵"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"自訂鍵盤快速鍵"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"要移除快速鍵嗎?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"要重設為預設值嗎?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"按下按鍵即可指派快速鍵"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"這項操作會永久刪除自訂快速鍵。"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"這麼做會永久刪除所有快速鍵。"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"搜尋快速鍵"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"找不到相符的搜尋結果"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"快捷操作鍵或修飾鍵圖示"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"加號圖示"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"自訂"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"重設"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"完成"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> @@ -1453,8 +1451,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"鍵盤設定"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"設定快速鍵"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"移除"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"是,請重設"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"取消"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"按下按鍵"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"這個按鍵組合已在使用中,請改用其他按鍵。"</string> @@ -1486,8 +1483,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"按下鍵盤上的快捷操作鍵"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"非常好!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"你已完成「查看所有應用程式」手勢教學課程"</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"教學課程動畫,按一下即可暫停和繼續播放。"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"居家控制"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 9d4f70c40aef..a9fa1ba36df2 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -529,9 +529,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Ukuze uvule i-app usebenzisa iwijethi, uzodinga ukuqinisekisa ukuthi nguwe. Futhi, khumbula ukuthi noma ubani angakwazi ukuzibuka, nanoma ithebhulethi yakho ikhiyiwe. Amanye amawijethi kungenzeka abengahloselwe ukukhiya isikrini sakho futhi kungenzeka awaphephile ukuthi angafakwa lapha."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"Ngiyezwa"</string> <string name="glanceable_hub_lockscreen_affordance_label" msgid="1461611028615752141">"Amawijethi"</string> - <!-- no translation found for glanceable_hub_lockscreen_affordance_disabled_text (599170482297578735) --> - <skip /> - <!-- no translation found for glanceable_hub_lockscreen_affordance_action_button_label (7636151133344609375) --> + <string name="glanceable_hub_lockscreen_affordance_disabled_text" msgid="599170482297578735">"Ukuze ufake isinqamuleli esithi \"Amawijethi\", qinisekisa ukuthi okuthi \"Bonisa amawijethi esikrinini sokukhiya\" kunikwe amandla kumasethingi."</string> + <string name="glanceable_hub_lockscreen_affordance_action_button_label" msgid="7636151133344609375">"Amasethingi"</string> + <!-- no translation found for accessibility_glanceable_hub_to_dream_button (7552776300297055307) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Shintsha umsebenzisi"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"imenyu yokudonsela phansi"</string> @@ -709,8 +709,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Ukulandelela Ikhanda"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Thepha ukuze ushintshe imodi yokukhala"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"imodi yokukhala"</string> - <!-- no translation found for volume_ringer_drawer_closed_content_description (4737792429808781745) --> - <skip /> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, thepha ukuze ushintshe imodi yokukhala"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"thulisa"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"susa ukuthula"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"dlidliza"</string> @@ -875,9 +874,12 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Khiya isikrini"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"Thatha inothi"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"Ukwenza imisebenzi eminingi"</string> - <string name="system_multitasking_rhs" msgid="8714224917276297810">"Sebenzisa isikrini esihlukanisayo nge-app yamanje kwesokudla"</string> - <string name="system_multitasking_lhs" msgid="8402954791206308783">"Sebenzisa isikrini sokuhlukanisa nge-app yamanje kwesokunxele"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Shintsha usuka ekuhlukaniseni isikrini uye kusikrini esigcwele"</string> + <!-- no translation found for system_multitasking_rhs (8779289852395243004) --> + <skip /> + <!-- no translation found for system_multitasking_lhs (7348595296208696452) --> + <skip /> + <!-- no translation found for system_multitasking_full_screen (4940465971687159429) --> + <skip /> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Shintshela ku-app ngakwesokudla noma ngezansi ngenkathi usebenzisa uhlukanisa isikrini"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Shintshela ku-app ngakwesokunxele noma ngaphezulu ngenkathi usebenzisa ukuhlukanisa isikrini"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Ngesikhathi sokuhlukaniswa kwesikrini: shintsha i-app ngenye"</string> @@ -1430,20 +1432,17 @@ <string name="shortcut_helper_title" msgid="8567500639300970049">"Izinqamuleli zekhibhodi"</string> <string name="shortcut_helper_customize_mode_title" msgid="1467657117101096033">"Hlela izinqamuleli zekhibhodi ngendlela oyifisayo"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Susa isinqamuleli?"</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_dialog_title (8131184731313717780) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Setha kabusha ubuyele kokuzenzakalelayo?"</string> <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Cindezela ukhiye ukuze unikeze isinqamuleli"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Lokhu kuzosula isinqamuleli sakho somuntu ngamunye unomphela."</string> - <!-- no translation found for shortcut_customize_mode_reset_shortcut_description (2081849715634358684) --> - <skip /> + <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Lokhu kuzosula unomphela zonke izinqamuleli zakho zangokwezifiso."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Sesha izinqamuleli"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"Ayikho imiphumela yosesho"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Goqa isithonjana"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Isithonjana sesenzo noma seMeta"</string> <string name="shortcut_helper_content_description_plus_icon" msgid="6152683734278299020">"Isithonjana sesengezo"</string> <string name="shortcut_helper_customize_button_text" msgid="3124983502748069338">"Enza ngendlela oyifisayo"</string> - <!-- no translation found for shortcut_helper_reset_button_text (2548243844050633472) --> - <skip /> + <string name="shortcut_helper_reset_button_text" msgid="2548243844050633472">"Setha kabusha"</string> <string name="shortcut_helper_done_button_text" msgid="7249905942125386191">"Kwenziwe"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Nweba isithonjana"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"noma"</string> @@ -1453,8 +1452,7 @@ <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Amasethingi Ekhibhodi"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Setha isinqamuleli"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Susa"</string> - <!-- no translation found for shortcut_helper_customize_dialog_reset_button_label (7645535254306312685) --> - <skip /> + <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yebo, setha kabusha"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Khansela"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Cindezela ukhiye"</string> <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Inhlanganisela yokhiye isiyasetshenziswa kakade. Zama omunye ukhiye."</string> @@ -1486,8 +1484,7 @@ <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Cindezela inkinobho yokufinyelela kukhibhodi yakho"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Wenze kahle!"</string> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Uqedele ukunyakazisa kokubuka onke ama-app."</string> - <!-- no translation found for tutorial_animation_content_description (2698816574982370184) --> - <skip /> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Okopopayi okokufundisa, chofoza ukuze umise kancane futhi uqalise kabusha ukudlala."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Ilambu lekhibhodi"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ileveli %1$d ka-%2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Izilawuli Zasekhaya"</string> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index a3752640e7ed..28df2e2a1b8c 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -124,7 +124,7 @@ <!-- Keyboard shortcuts colors --> <color name="ksh_application_group_color">#fff44336</color> <color name="ksh_key_item_color">@*android:color/system_on_surface_variant_light</color> - <color name="ksh_key_item_background">?androidprv:attr/materialColorSurfaceContainerHighest</color> + <color name="ksh_key_item_background">@androidprv:color/materialColorSurfaceContainerHighest</color> <color name="instant_apps_color">#ff4d5a64</color> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 05c13f20f6d2..f927e26e0cd9 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1950,6 +1950,21 @@ <!-- Text displayed indicating that the user might be able to use satellite SOS. --> <string name="satellite_emergency_only_carrier_text">Emergency calls or SOS</string> + <!-- Content description skeleton. Input strings should be carrier name and signal bar description [CHAR LIMIT=NONE]--> + <string name="accessibility_phone_string_format"><xliff:g id="carrier_name" example="Carrier Name">%1$s</xliff:g>, <xliff:g id="signal_strength_description" example="two bars">%2$s</xliff:g>.</string> + <!-- Content description describing 0 signal bars. [CHAR LIMIT=NONE] --> + <string name="accessibility_no_signal">no signal</string> + <!-- Content description describing 1 signal bar. [CHAR LIMIT=NONE] --> + <string name="accessibility_one_bar">one bar</string> + <!-- Content description describing 2 signal bars. [CHAR LIMIT=NONE] --> + <string name="accessibility_two_bars">two bars</string> + <!-- Content description describing 3 signal bars. [CHAR LIMIT=NONE] --> + <string name="accessibility_three_bars">three bars</string> + <!-- Content description describing 4 signal bars. [CHAR LIMIT=NONE] --> + <string name="accessibility_four_bars">four bars</string> + <!-- Content description describing full signal bars. [CHAR LIMIT=NONE] --> + <string name="accessibility_signal_full">signal full</string> + <!-- Accessibility label for managed profile icon (not shown on screen) [CHAR LIMIT=NONE] --> <string name="accessibility_managed_profile">Work profile</string> @@ -2046,8 +2061,9 @@ <!-- Text shown in notification guts for conversation notifications that don't implement the full feature --> <string name="no_shortcut"><xliff:g id="app_name" example="YouTube">%1$s</xliff:g> doesn\u2019t support conversation features</string> + <!-- TODO: b/381099727 - Mark translatable once feedback layout is finalized. --> <!-- [CHAR LIMIT=80] Text shown in feedback button in notification guts for a bundled notification --> - <string name="notification_guts_bundle_feedback">Provide Bundle Feedback</string> + <string name="notification_guts_bundle_feedback" translatable="false">Provide Bundle Feedback</string> <!-- Notification: Control panel: Label that displays when the app's notifications cannot be blocked. --> <string name="notification_unblockable_desc">These notifications can\'t be modified.</string> @@ -2575,8 +2591,6 @@ <!-- Tuner string --> <!-- Tuner string --> - <!-- Message shown during shutdown when Find My Device with Dead Battery Finder is active [CHAR LIMIT=300] --> - <string name="finder_active">You can locate this phone with Find My Device even when powered off</string> <!-- Shutdown Progress Dialog. This is shown if the user chooses to power off the phone. [CHAR LIMIT=60] --> <string name="shutdown_progress">Shutting down\u2026</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 9aa71374fb8e..12f6e6958b42 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -151,7 +151,7 @@ <style name="TextAppearance.QS.UserSwitcher"> <item name="android:textSize">@dimen/qs_tile_text_size</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> </style> <!-- This is hard coded to be sans-serif-condensed to match the icons --> @@ -183,67 +183,46 @@ <item name="android:textColor">?android:attr/textColorPrimary</item> </style> - <style name="TextAppearance.AuthCredential.OldTitle"> - <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:paddingTop">12dp</item> - <item name="android:paddingHorizontal">24dp</item> - <item name="android:textSize">24sp</item> - </style> - - <style name="TextAppearance.AuthCredential.OldSubtitle"> - <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:paddingTop">8dp</item> - <item name="android:paddingHorizontal">24dp</item> - <item name="android:textSize">16sp</item> - </style> - - <style name="TextAppearance.AuthCredential.OldDescription"> - <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:paddingTop">8dp</item> - <item name="android:paddingHorizontal">24dp</item> - <item name="android:textSize">14sp</item> - </style> - <style name="TextAppearance.AuthCredential.LogoDescription" parent="TextAppearance.Material3.LabelLarge" > <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item> - <item name="android:gravity">@integer/biometric_dialog_text_gravity</item> + <item name="android:gravity">center_horizontal</item> <item name="android:maxLines">1</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> <item name="android:ellipsize">end</item> </style> <style name="TextAppearance.AuthCredential.Title" parent="TextAppearance.Material3.HeadlineSmall" > <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthCredential.Subtitle" parent="TextAppearance.Material3.BodyMedium" > <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthCredential.Description" parent="TextAppearance.Material3.BodyMedium" > <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthCredential.VerticalListContentViewDescription" parent="TextAppearance.Material3.TitleSmall"> <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthCredential.ContentViewWithButtonDescription" parent="TextAppearance.AuthCredential.Description" /> <style name="TextAppearance.AuthCredential.ContentViewListItem" parent="TextAppearance.Material3.BodySmall"> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> <item name="android:paddingTop">@dimen/biometric_prompt_content_list_item_padding_top</item> <item name="android:breakStrategy">high_quality</item> </style> <style name="TextAppearance.AuthCredential.Indicator" parent="TextAppearance.Material3.BodyMedium"> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:marqueeRepeatLimit">marquee_forever</item> <item name="android:singleLine">true</item> <item name="android:ellipsize">marquee</item> @@ -269,21 +248,21 @@ <item name="android:layout_marginTop">24dp</item> <item name="android:textSize">36dp</item> <item name="android:focusable">true</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Subtitle"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">20dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Description"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:layout_marginTop">20dp</item> <item name="android:textSize">18sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.AuthNonBioCredential.Error"> @@ -352,7 +331,7 @@ </style> <style name="AuthNonCredentialPanelStyle"> - <item name="android:background">?androidprv:attr/materialColorSurfaceBright</item> + <item name="android:background">@androidprv:color/materialColorSurfaceBright</item> </style> <style name="AuthCredentialPanelStyle" parent="AuthNonCredentialPanelStyle"> @@ -383,13 +362,13 @@ <item name="android:minWidth">48dp</item> <item name="android:paddingLeft">0dp</item> <item name="android:paddingRight">12dp</item> - <item name="android:textColor">?androidprv:attr/materialColorPrimary</item> + <item name="android:textColor">@androidprv:color/materialColorPrimary</item> </style> <style name="AuthCredentialNegativeButtonStyle" parent="TextAppearance.Material3.LabelLarge"> <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item> <item name="android:background">@color/transparent</item> - <item name="android:textColor">?androidprv:attr/materialColorPrimary</item> + <item name="android:textColor">@androidprv:color/materialColorPrimary</item> </style> <style name="DeviceManagementDialogTitle"> @@ -411,7 +390,7 @@ </style> <style name="KeyboardShortcutHelper.BottomSheet.DragHandle" parent="Widget.Material3.BottomSheet.DragHandle"> - <item name="tint">?androidprv:attr/materialColorOutlineVariant</item> + <item name="tint">@androidprv:color/materialColorOutlineVariant</item> </style> <style name="KeyboardShortcutHelper.BottomSheetDialogAnimation"> @@ -510,23 +489,23 @@ <item name="android:windowIsFloating">true</item> <item name="android:homeAsUpIndicator">@drawable/ic_arrow_back</item> - <item name="surfaceBright">?androidprv:attr/materialColorSurfaceBright</item> + <item name="surfaceBright">@androidprv:color/materialColorSurfaceBright</item> <item name="android:colorBackground">?attr/surfaceBright</item> - <item name="scHigh">?androidprv:attr/materialColorSurfaceContainerHigh</item> - <item name="primary">?androidprv:attr/materialColorPrimary</item> - <item name="tertiary">?androidprv:attr/materialColorTertiary</item> - <item name="onSurface">?androidprv:attr/materialColorOnSurface</item> - <item name="onSurfaceVariant">?androidprv:attr/materialColorOnSurfaceVariant</item> - <item name="outline">?androidprv:attr/materialColorOutline</item> - - <item name="shadeActive">?androidprv:attr/customColorShadeActive</item> - <item name="onShadeActive">?androidprv:attr/customColorOnShadeActive</item> - <item name="onShadeActiveVariant">?androidprv:attr/customColorOnShadeActiveVariant</item> - <item name="shadeInactive">?androidprv:attr/customColorShadeInactive</item> - <item name="onShadeInactive">?androidprv:attr/customColorOnShadeInactive</item> - <item name="onShadeInactiveVariant">?androidprv:attr/customColorOnShadeInactiveVariant</item> - <item name="shadeDisabled">?androidprv:attr/customColorShadeDisabled</item> - <item name="underSurface">?androidprv:attr/customColorUnderSurface</item> + <item name="scHigh">@androidprv:color/materialColorSurfaceContainerHigh</item> + <item name="primary">@androidprv:color/materialColorPrimary</item> + <item name="tertiary">@androidprv:color/materialColorTertiary</item> + <item name="onSurface">@androidprv:color/materialColorOnSurface</item> + <item name="onSurfaceVariant">@androidprv:color/materialColorOnSurfaceVariant</item> + <item name="outline">@androidprv:color/materialColorOutline</item> + + <item name="shadeActive">@androidprv:color/customColorShadeActive</item> + <item name="onShadeActive">@androidprv:color/customColorOnShadeActive</item> + <item name="onShadeActiveVariant">@androidprv:color/customColorOnShadeActiveVariant</item> + <item name="shadeInactive">@androidprv:color/customColorShadeInactive</item> + <item name="onShadeInactive">@androidprv:color/customColorOnShadeInactive</item> + <item name="onShadeInactiveVariant">@androidprv:color/customColorOnShadeInactiveVariant</item> + <item name="shadeDisabled">@androidprv:color/customColorShadeDisabled</item> + <item name="underSurface">@androidprv:color/customColorUnderSurface</item> <item name="android:itemTextAppearance">@style/Control.MenuItem</item> </style> @@ -588,7 +567,7 @@ <item name="android:buttonBarPositiveButtonStyle">@style/Widget.Dialog.Button</item> <item name="android:buttonBarNegativeButtonStyle">@style/Widget.Dialog.Button.BorderButton</item> <item name="android:buttonBarNeutralButtonStyle">@style/Widget.Dialog.Button.BorderButton</item> - <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceBright</item> + <item name="android:colorBackground">@androidprv:color/materialColorSurfaceBright</item> <item name="android:alertDialogStyle">@style/ScrollableAlertDialogStyle</item> <item name="android:buttonBarStyle">@style/ButtonBarStyle</item> <item name="android:buttonBarButtonStyle">@style/Widget.Dialog.Button.Large</item> @@ -744,34 +723,34 @@ <style name="TextAppearance.NotificationImportanceChannel"> <item name="android:textSize">@dimen/notification_importance_channel_text</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:textSize">@dimen/notification_importance_channel_text</item> </style> <style name="TextAppearance.NotificationImportanceChannelGroup"> <item name="android:textSize">@dimen/notification_importance_channel_group_text</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:textSize">@dimen/notification_importance_channel_group_text</item> </style> <style name="TextAppearance.NotificationImportanceApp"> <item name="android:textSize">@dimen/notification_importance_channel_group_text</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> <item name="android:textSize">@dimen/notification_importance_channel_group_text</item> </style> <style name="TextAppearance.NotificationImportanceHeader"> <item name="android:textSize">@dimen/notification_importance_header_text</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.NotificationImportanceDetail"> <item name="android:textSize">@dimen/notification_importance_description_text</item> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> <item name="android:gravity">center</item> </style> @@ -785,7 +764,7 @@ <style name="TextAppearance.NotificationSectionHeaderLabel" parent="@android:style/Widget.DeviceDefault.Button.Borderless"> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:textAllCaps">false</item> <item name="android:textSize">14sp</item> <item name="android:minWidth">0dp</item> @@ -794,7 +773,7 @@ <style name="TextAppearance.NotificationSectionHeaderButton" parent="@android:style/Widget.DeviceDefault.Button.Borderless"> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:textAllCaps">false</item> <item name="android:textSize">14sp</item> <item name="android:minWidth">0dp</item> @@ -803,7 +782,7 @@ <style name="TextAppearance.NotificationFooterButton" parent="@android:style/Widget.DeviceDefault.Button.Borderless"> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:textAllCaps">false</item> <item name="android:textSize">14sp</item> <item name="android:minWidth">0dp</item> @@ -812,8 +791,8 @@ <style name="TextAppearance.NotificationFooterButtonRedesign" parent="@android:style/Widget.DeviceDefault.Button.Borderless"> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> - <item name="android:drawableTint">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> + <item name="android:drawableTint">@androidprv:color/materialColorOnSurface</item> <item name="android:textAllCaps">false</item> <item name="android:textSize">16sp</item> <item name="android:minWidth">0dp</item> @@ -1009,12 +988,12 @@ </style> <style name="LongScreenshotActivity" parent="@android:style/Theme.DeviceDefault.DayNight"> - <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceContainer</item> + <item name="android:colorBackground">@androidprv:color/materialColorSurfaceContainer</item> <item name="android:windowNoTitle">true</item> <item name="android:windowLightStatusBar">true</item> <item name="android:windowLightNavigationBar">true</item> - <item name="android:statusBarColor">?androidprv:attr/materialColorSurfaceContainer</item> - <item name="android:navigationBarColor">?androidprv:attr/materialColorSurfaceContainerHighest</item> + <item name="android:statusBarColor">@androidprv:color/materialColorSurfaceContainer</item> + <item name="android:navigationBarColor">@androidprv:color/materialColorSurfaceContainerHighest</item> <item name="android:windowActivityTransitions">true</item> </style> @@ -1092,7 +1071,7 @@ <style name="Theme.VolumePanel.Popup" parent="@style/Theme.SystemUI.Dialog"> <item name="android:dialogCornerRadius">44dp</item> - <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceContainerHigh + <item name="android:colorBackground">@androidprv:color/materialColorSurfaceContainerHigh </item> </style> @@ -1303,7 +1282,7 @@ </style> <style name="TextAppearance.Dialog.Title" parent="@android:style/TextAppearance.DeviceDefault.Large"> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:textSize">@dimen/dialog_title_text_size</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:lineHeight">32sp</item> @@ -1313,7 +1292,7 @@ </style> <style name="TextAppearance.Dialog.Body" parent="@android:style/TextAppearance.DeviceDefault.Medium"> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> <item name="android:textSize">14sp</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:lineHeight">20sp</item> @@ -1408,7 +1387,7 @@ <style name="InternetDialog.NetworkTitle.Active"> <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Active</item> - <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item> + <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item> </style> <style name="InternetDialog.NetworkSummary"> @@ -1421,27 +1400,27 @@ <style name="InternetDialog.NetworkSummary.Active"> <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Secondary.Active </item> - <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item> + <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item> </style> <style name="TextAppearance.InternetDialog"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:textSize">16sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:textDirection">locale</item> </style> <style name="TextAppearance.InternetDialog.Secondary"> <item name="android:textSize">14sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> </style> <style name="TextAppearance.InternetDialog.Active"> - <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item> + <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item> </style> <style name="TextAppearance.InternetDialog.Secondary.Active"> - <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item> + <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item> </style> <style name="FgsManagerDialogTitle"> @@ -1478,18 +1457,18 @@ <item name="android:orientation">horizontal</item> <item name="android:focusable">true</item> <item name="android:clickable">true</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.BluetoothTileDialog"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:textDirection">locale</item> <item name="android:textAlignment">gravity</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.BluetoothTileDialog.Active"> - <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item> + <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item> </style> <style name="BluetoothTileDialog.AudioSharingButton" parent="Widget.Dialog.Button"> @@ -1686,7 +1665,7 @@ <style name="ShortCutButton" parent="@android:style/Widget.Material.Button"> <item name="android:background">@drawable/shortcut_button_colored</item> <item name="android:textSize">16sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> <item name="android:layout_marginEnd">12dp</item> <item name="android:paddingLeft">24dp</item> <item name="android:paddingRight">24dp</item> @@ -1712,18 +1691,18 @@ parent="@android:style/TextAppearance.DeviceDefault.Medium"> <item name="android:textSize">14sp</item> <item name="android:lineHeight">20sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurface</item> </style> <style name="TextAppearance.PrivacyDialog.Item.Summary" parent="@android:style/TextAppearance.DeviceDefault.Small"> <item name="android:textSize">14sp</item> <item name="android:lineHeight">20sp</item> - <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item> </style> <style name="Theme.PrivacyDialog" parent="@style/Theme.SystemUI.Dialog"> - <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceContainer</item> + <item name="android:colorBackground">@androidprv:color/materialColorSurfaceContainer</item> </style> <style name="Theme.SystemUI.Dialog.StickyKeys" parent="@style/Theme.SystemUI.Dialog"> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java index 9e8cabf141ed..8576a6ebac42 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java @@ -330,6 +330,11 @@ public class Task { } @Override + public int hashCode() { + return key.hashCode(); + } + + @Override public String toString() { return "[" + key.toString() + "] " + title; } diff --git a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt index 495367b69123..842efa3d68d0 100644 --- a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt +++ b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt @@ -25,7 +25,6 @@ import android.content.res.ColorStateList import android.util.AttributeSet import android.view.View import com.android.app.animation.Interpolators -import com.android.settingslib.Utils import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.TITLE /** Displays security messages for the keyguard bouncer. */ @@ -71,12 +70,12 @@ open class BouncerKeyguardMessageArea(context: Context?, attrs: AttributeSet?) : } override fun onThemeChanged() { - mDefaultColorState = getColorInStyle() ?: Utils.getColorAttr(context, TITLE) + mDefaultColorState = getColorInStyle() ?: ColorStateList.valueOf(context.getColor(TITLE)) super.onThemeChanged() } override fun reloadColor() { - mDefaultColorState = getColorInStyle() ?: Utils.getColorAttr(context, TITLE) + mDefaultColorState = getColorInStyle() ?: ColorStateList.valueOf(context.getColor(TITLE)) super.reloadColor() } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index fcaccd27a567..36afe1e0fe18 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -346,8 +346,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { setPadding(getPaddingLeft(), getPaddingTop() + getResources().getDimensionPixelSize( R.dimen.keyguard_security_container_padding_top), getPaddingRight(), getPaddingBottom()); - setBackgroundColor(Utils.getColorAttrDefaultColor(getContext(), - com.android.internal.R.attr.materialColorSurfaceDim)); + setBackgroundColor( + getContext().getColor(com.android.internal.R.color.materialColorSurfaceDim)); } void onResume(SecurityMode securityMode, boolean faceAuthEnabled) { @@ -814,8 +814,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { void reloadColors() { mViewMode.reloadColors(); - setBackgroundColor(Utils.getColorAttrDefaultColor(getContext(), - com.android.internal.R.attr.materialColorSurfaceDim)); + setBackgroundColor(getContext().getColor( + com.android.internal.R.color.materialColorSurfaceDim)); } /** Handles density or font scale changes. */ diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt index 392abf2aa82c..0942353a7110 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt @@ -20,7 +20,6 @@ import android.content.Context import android.util.AttributeSet import android.widget.ImageView import androidx.core.graphics.drawable.DrawableCompat -import com.android.settingslib.Utils import com.android.systemui.res.R import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.EMERGENCY_BUTTON @@ -45,7 +44,7 @@ abstract class KeyguardSimInputView(context: Context, attrs: AttributeSet) : override fun reloadColors() { super.reloadColors() - val imageColor = Utils.getColorAttrDefaultColor(context, EMERGENCY_BUTTON) + val imageColor = context.getColor(EMERGENCY_BUTTON) simImageView?.let { val wrappedDrawable = DrawableCompat.wrap(it.drawable) DrawableCompat.setTint(wrappedDrawable, imageColor) diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java index e77341651a8e..dccf53a369ac 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java @@ -15,13 +15,11 @@ */ package com.android.keyguard; -import static com.android.settingslib.Utils.getColorAttrDefaultColor; import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_BACKGROUND; import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_BACKGROUND_PRESSED; import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_BUTTON; import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_KEY; import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_PRESSED; -import static com.android.systemui.util.ColorUtilKt.getPrivateAttrColorIfUnset; import android.animation.AnimatorSet; import android.animation.ArgbEvaluator; @@ -127,17 +125,18 @@ class NumPadAnimator { int[] customAttrs = {android.R.attr.colorControlNormal}; ContextThemeWrapper ctw = new ContextThemeWrapper(context, mStyle); @SuppressLint("ResourceType") TypedArray a = ctw.obtainStyledAttributes(customAttrs); - mNormalBackgroundColor = getPrivateAttrColorIfUnset(ctw, a, 0, 0, - NUM_PAD_BACKGROUND); + + mNormalBackgroundColor = a.getColor(0, context.getColor(NUM_PAD_BACKGROUND)); + a.recycle(); - mPressedBackgroundColor = getColorAttrDefaultColor(context, NUM_PAD_BACKGROUND_PRESSED); - mTextColorPressed = getColorAttrDefaultColor(context, NUM_PAD_PRESSED); + mPressedBackgroundColor = context.getColor(NUM_PAD_BACKGROUND_PRESSED); + mTextColorPressed = context.getColor(NUM_PAD_PRESSED); mBackground.setColor(mNormalBackgroundColor); mTextColorPrimary = isNumPadKey - ? getColorAttrDefaultColor(context, NUM_PAD_KEY) - : getColorAttrDefaultColor(context, NUM_PAD_BUTTON); + ? context.getColor(NUM_PAD_KEY) + : context.getColor(NUM_PAD_BUTTON); createAnimators(); } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java index a81c1b0bf9c3..d7799bf505bd 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java @@ -30,7 +30,6 @@ import android.view.accessibility.AccessibilityNodeInfo; import androidx.annotation.Nullable; -import com.android.settingslib.Utils; import com.android.systemui.res.R; /** @@ -101,7 +100,7 @@ public class NumPadButton extends AlphaOptimizedImageButton implements NumPadAni if (mAnimator != null) mAnimator.reloadColors(getContext()); int textColorResId = mIsTransparentMode ? NUM_PAD_KEY : NUM_PAD_BUTTON; - int imageColor = Utils.getColorAttrDefaultColor(getContext(), textColorResId); + int imageColor = getContext().getColor(textColorResId); ((VectorDrawable) getDrawable()).setTintList(ColorStateList.valueOf(imageColor)); } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java index ebde8a3057ce..e8a702f5fca3 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java @@ -155,8 +155,7 @@ public class NumPadKey extends ViewGroup implements NumPadAnimationListener { * Reload colors from resources. **/ public void reloadColors() { - int textColor = Utils.getColorAttr(getContext(), NUM_PAD_KEY) - .getDefaultColor(); + int textColor = getContext().getColor(NUM_PAD_KEY); int klondikeColor = Utils.getColorAttr(getContext(), android.R.attr.textColorSecondary) .getDefaultColor(); mDigitText.setTextColor(textColor); diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java index 5e9eed98f97b..bac9dacef9e1 100644 --- a/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java +++ b/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java @@ -28,7 +28,6 @@ import android.widget.LinearLayout; import androidx.core.graphics.drawable.DrawableCompat; -import com.android.settingslib.Utils; import com.android.systemui.res.R; /** @@ -39,8 +38,7 @@ public class PinShapeHintingView extends LinearLayout implements PinShapeInput { private int mPinLength; private int mDotDiameter; - private int mColor = Utils.getColorAttr(getContext(), PIN_SHAPES) - .getDefaultColor(); + private int mColor = getContext().getColor(PIN_SHAPES); private int mPosition = 0; private static final int DEFAULT_PIN_LENGTH = 6; private PinShapeAdapter mPinShapeAdapter; diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java index ee70de3e86a0..26a774e991a0 100644 --- a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java +++ b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java @@ -39,7 +39,6 @@ import android.widget.LinearLayout; import androidx.core.graphics.drawable.DrawableCompat; import com.android.app.animation.Interpolators; -import com.android.settingslib.Utils; import com.android.systemui.res.R; /** @@ -49,7 +48,7 @@ import com.android.systemui.res.R; public class PinShapeNonHintingView extends LinearLayout implements PinShapeInput { private static final int RESET_STAGGER_DELAY = 40; private static final int RESET_MAX_DELAY = 200; - private int mColor = Utils.getColorAttr(getContext(), PIN_SHAPES).getDefaultColor(); + private int mColor = getContext().getColor(PIN_SHAPES); private int mPosition = 0; private boolean mIsAnimatingReset = false; private final PinShapeAdapter mPinShapeAdapter; diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt index 3abcb139ab5c..11ce168b9bcb 100644 --- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt @@ -32,7 +32,6 @@ import android.view.View import androidx.core.graphics.ColorUtils import com.android.app.animation.Interpolators import com.android.keyguard.KeyguardUpdateMonitor -import com.android.settingslib.Utils import com.android.systemui.biometrics.AuthController import com.android.systemui.log.ScreenDecorationsLogger import com.android.systemui.plugins.statusbar.StatusBarStateController @@ -60,8 +59,8 @@ class FaceScanningOverlay( private val rimRect = RectF() private var cameraProtectionColor = Color.BLACK - var faceScanningAnimColor = Utils.getColorAttrDefaultColor(context, - com.android.internal.R.attr.materialColorPrimaryFixed) + var faceScanningAnimColor = + context.getColor(com.android.internal.R.color.materialColorPrimaryFixed) private var cameraProtectionAnimator: ValueAnimator? = null var hideOverlayRunnable: Runnable? = null diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/OWNERS b/packages/SystemUI/src/com/android/systemui/accessibility/OWNERS index 1f66c91b3573..1ed8c068f974 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/OWNERS +++ b/packages/SystemUI/src/com/android/systemui/accessibility/OWNERS @@ -1,3 +1,4 @@ # Bug component: 44215 -include /core/java/android/view/accessibility/OWNERS
\ No newline at end of file +include /core/java/android/view/accessibility/OWNERS +jonesriley@google.com
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java index 559e6f767f7b..ffb5f3d47bcc 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java @@ -20,6 +20,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_FADE_ import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_MIGRATION_TOOLTIP_PROMPT; import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_OPACITY; import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE; +import static android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets; @@ -42,6 +43,7 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.View; +import android.view.accessibility.AccessibilityManager; import androidx.annotation.NonNull; @@ -75,6 +77,9 @@ class MenuInfoRepository { private final Context mContext; private final Configuration mConfiguration; + private final AccessibilityManager mAccessibilityManager; + private final AccessibilityManager.AccessibilityServicesStateChangeListener + mA11yServicesStateChangeListener = manager -> onTargetFeaturesChanged(); private final Handler mHandler = new Handler(Looper.getMainLooper()); private final OnSettingsContentsChanged mSettingsContentsCallback; private final SecureSettings mSecureSettings; @@ -142,9 +147,10 @@ class MenuInfoRepository { } }; - MenuInfoRepository(Context context, + MenuInfoRepository(Context context, AccessibilityManager accessibilityManager, OnSettingsContentsChanged settingsContentsChanged, SecureSettings secureSettings) { mContext = context; + mAccessibilityManager = accessibilityManager; mConfiguration = new Configuration(context.getResources().getConfiguration()); mSettingsContentsCallback = settingsContentsChanged; mSecureSettings = secureSettings; @@ -238,6 +244,13 @@ class MenuInfoRepository { mSecureSettings.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS), /* notifyForDescendants */ false, mMenuTargetFeaturesContentObserver, UserHandle.USER_CURRENT); + if (!com.android.systemui.Flags.floatingMenuNarrowTargetContentObserver()) { + mSecureSettings.registerContentObserverForUserSync( + mSecureSettings.getUriFor(ENABLED_ACCESSIBILITY_SERVICES), + /* notifyForDescendants */ false, + mMenuTargetFeaturesContentObserver, + UserHandle.USER_CURRENT); + } mSecureSettings.registerContentObserverForUserSync( mSecureSettings.getUriFor(Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE), /* notifyForDescendants */ false, mMenuSizeContentObserver, @@ -251,6 +264,11 @@ class MenuInfoRepository { /* notifyForDescendants */ false, mMenuFadeOutContentObserver, UserHandle.USER_CURRENT); mContext.registerComponentCallbacks(mComponentCallbacks); + + if (!com.android.systemui.Flags.floatingMenuNarrowTargetContentObserver()) { + mAccessibilityManager.addAccessibilityServicesStateChangeListener( + mA11yServicesStateChangeListener); + } } void unregisterObserversAndCallbacks() { @@ -258,6 +276,11 @@ class MenuInfoRepository { mContext.getContentResolver().unregisterContentObserver(mMenuSizeContentObserver); mContext.getContentResolver().unregisterContentObserver(mMenuFadeOutContentObserver); mContext.unregisterComponentCallbacks(mComponentCallbacks); + + if (!com.android.systemui.Flags.floatingMenuNarrowTargetContentObserver()) { + mAccessibilityManager.removeAccessibilityServicesStateChangeListener( + mA11yServicesStateChangeListener); + } } interface OnSettingsContentsChanged { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java index cfcaa4fea99b..cb96e7859fba 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java @@ -42,7 +42,8 @@ class MenuViewLayerController implements IAccessibilityFloatingMenu { NavigationModeController navigationModeController) { mWindowManager = viewCaptureAwareWindowManager; - MenuViewModel menuViewModel = new MenuViewModel(context, secureSettings); + MenuViewModel menuViewModel = new MenuViewModel( + context, accessibilityManager, secureSettings); MenuViewAppearance menuViewAppearance = new MenuViewAppearance(context, windowManager); mMenuViewLayer = new MenuViewLayer(context, windowManager, accessibilityManager, diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java index 46c407e24fe2..f924784a5535 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java @@ -17,6 +17,7 @@ package com.android.systemui.accessibility.floatingmenu; import android.content.Context; +import android.view.accessibility.AccessibilityManager; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; @@ -42,9 +43,10 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged { private final MutableLiveData<Position> mPercentagePositionData = new MutableLiveData<>(); private final MenuInfoRepository mInfoRepository; - MenuViewModel(Context context, SecureSettings secureSettings) { - mInfoRepository = new MenuInfoRepository(context, /* settingsContentsChanged= */ this, - secureSettings); + MenuViewModel(Context context, AccessibilityManager accessibilityManager, + SecureSettings secureSettings) { + mInfoRepository = new MenuInfoRepository(context, + accessibilityManager, /* settingsContentsChanged= */ this, secureSettings); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java index ad12229fe4e7..56435df1ad2c 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java @@ -52,7 +52,6 @@ import androidx.annotation.VisibleForTesting; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.android.settingslib.Utils; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -472,8 +471,8 @@ public class HearingDevicesDialogDelegate implements SystemUIDialog.Delegate, view.setContentDescription(item.getToolName()); icon.setImageDrawable(item.getToolIcon()); if (item.isCustomIcon()) { - icon.getDrawable().mutate().setTint(Utils.getColorAttr(context, - com.android.internal.R.attr.materialColorOnPrimaryContainer).getDefaultColor()); + icon.getDrawable().mutate().setTint(context.getColor( + com.android.internal.R.color.materialColorOnPrimaryContainer)); } text.setText(item.getToolName()); Intent intent = item.getToolIntent(); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java index e47e4b27d58a..7e1d538a80ee 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java @@ -27,7 +27,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.android.settingslib.Utils; import com.android.systemui.bluetooth.qsdialog.DeviceItem; import com.android.systemui.res.R; @@ -131,10 +130,9 @@ public class HearingDevicesListAdapter extends RecyclerView.Adapter<RecyclerView } // tint different color in different state for bad color contrast problem - int tintColor = item.isActive() ? Utils.getColorAttr(mContext, - com.android.internal.R.attr.materialColorOnPrimaryContainer).getDefaultColor() - : Utils.getColorAttr(mContext, - com.android.internal.R.attr.materialColorOnSurface).getDefaultColor(); + int tintColor = item.isActive() ? mContext.getColor( + com.android.internal.R.color.materialColorOnPrimaryContainer) + : mContext.getColor(com.android.internal.R.color.materialColorOnSurface); Pair<Drawable, String> iconPair = item.getIconWithDescription(); if (iconPair != null) { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java index 28d742cfa49b..fda4f0385f55 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java @@ -64,9 +64,9 @@ public class HearingDevicesSpinnerAdapter extends ArrayAdapter<String> { TextView text = view.findViewById(R.id.hearing_devices_spinner_text); if (text != null) { - int tintColor = Utils.getColorAttr(mContext, - isSelected ? com.android.internal.R.attr.materialColorOnPrimaryContainer - : com.android.internal.R.attr.materialColorOnSurface).getDefaultColor(); + int tintColor = mContext.getColor( + isSelected ? com.android.internal.R.color.materialColorOnPrimaryContainer + : com.android.internal.R.color.materialColorOnSurface); text.setTextColor(tintColor); } return view; diff --git a/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java b/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java index 9e1b09cf7891..081d2a087b07 100644 --- a/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java @@ -75,8 +75,8 @@ public class AmbientStatusBarView extends ConstraintLayout { private ShadowInfo mAmbientShadowInfo; private int mDrawableSize; private int mDrawableInsetSize; - private static final float KEY_SHADOW_ALPHA = 0.35f; - private static final float AMBIENT_SHADOW_ALPHA = 0.4f; + private static final float KEY_SHADOW_ALPHA = 0.8f; + private static final float AMBIENT_SHADOW_ALPHA = 0.6f; public AmbientStatusBarView(Context context) { this(context, null); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 316849d90cf3..d0cb507789a1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -714,12 +714,12 @@ public class AuthController implements onDialogDismissed(reason); } @Inject - public AuthController(Context context, + public AuthController(@Main Context context, @Application CoroutineScope applicationCoroutineScope, Execution execution, CommandQueue commandQueue, ActivityTaskManager activityTaskManager, - @NonNull WindowManager windowManager, + @NonNull @Main WindowManager windowManager, @Nullable FingerprintManager fingerprintManager, @Nullable FaceManager faceManager, Optional<AuthContextPlugins> contextPlugins, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index f6cc72431db0..22d2aaf2a8e7 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -36,6 +36,7 @@ import com.android.systemui.Flags.lightRevealMigration import com.android.systemui.biometrics.data.repository.FacePropertyRepository import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.deviceentry.domain.interactor.AuthRippleInteractor import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.keyguard.shared.model.BiometricUnlockSource @@ -69,9 +70,9 @@ import javax.inject.Provider class AuthRippleController @Inject constructor( - private val sysuiContext: Context, + @Main private val sysuiContext: Context, private val authController: AuthController, - private val configurationController: ConfigurationController, + @Main private val configurationController: ConfigurationController, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, private val keyguardStateController: KeyguardStateController, private val wakefulnessLifecycle: WakefulnessLifecycle, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java index 027f6744d4d7..8376850c1a28 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.hardware.biometrics.BiometricSourceType; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; import javax.inject.Inject; @@ -43,7 +44,7 @@ public class BiometricNotificationBroadcastReceiver extends BroadcastReceiver { private final BiometricNotificationDialogFactory mNotificationDialogFactory; @Inject BiometricNotificationBroadcastReceiver( - Context context, + @Main Context context, BiometricNotificationDialogFactory notificationDialogFactory) { mContext = context; mNotificationDialogFactory = notificationDialogFactory; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java index 3b49ce2f10f7..e5c22677dbcc 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java @@ -45,6 +45,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.CoreStartable; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.res.R; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -145,7 +146,7 @@ public class BiometricNotificationService implements CoreStartable { }; @Inject - public BiometricNotificationService(@NonNull Context context, + public BiometricNotificationService(@NonNull @Main Context context, @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor, @NonNull KeyguardStateController keyguardStateController, @NonNull Handler handler, @NonNull NotificationManager notificationManager, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt index 178e1112fa6f..d9ed9ca1f07b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt @@ -24,7 +24,7 @@ import com.android.systemui.biometrics.shared.model.SensorLocation import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.shade.ShadeDisplayAware +import com.android.systemui.dagger.qualifiers.Main import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -43,7 +43,7 @@ constructor( @Application private val applicationScope: CoroutineScope, @Application private val context: Context, repository: FingerprintPropertyRepository, - @ShadeDisplayAware configurationInteractor: ConfigurationInteractor, + @Main configurationInteractor: ConfigurationInteractor, displayStateInteractor: DisplayStateInteractor, udfpsOverlayInteractor: UdfpsOverlayInteractor, ) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt index c3dc2d406cbc..52e85576e756 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt @@ -26,6 +26,7 @@ import com.android.systemui.biometrics.shared.model.DisplayRotation import com.android.systemui.biometrics.shared.model.FingerprintSensorType import com.android.systemui.biometrics.shared.model.isDefaultOrientation import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.KeyguardState @@ -48,9 +49,9 @@ import kotlinx.coroutines.flow.onEach class SideFpsSensorInteractor @Inject constructor( - private val context: Context, + @Main private val context: Context, fingerprintPropertyRepository: FingerprintPropertyRepository, - windowManager: WindowManager, + @Main windowManager: WindowManager, displayStateInteractor: DisplayStateInteractor, fingerprintInteractiveToAuthProvider: Optional<FingerprintInteractiveToAuthProvider>, biometricSettingsRepository: BiometricSettingsRepository, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt index 0ad83ec0c3f5..38b1d7d81332 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt @@ -37,7 +37,6 @@ import android.widget.Button import android.widget.LinearLayout import android.widget.Space import android.widget.TextView -import com.android.settingslib.Utils import com.android.systemui.biometrics.Utils.ellipsize import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.res.R @@ -294,7 +293,7 @@ private fun getListItemBulletGapWidth(resources: Resources): Int = resources.getDimensionPixelSize(R.dimen.biometric_prompt_content_list_item_bullet_gap_width) private fun getListItemBulletColor(context: Context): Int = - Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.materialColorOnSurface) + context.getColor(com.android.internal.R.color.materialColorOnSurface) private fun <T : View> T.width(function: (Int) -> Unit) { if (width == 0) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt index df34952f4f8d..4dcf26808a9e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt @@ -982,8 +982,9 @@ private fun Context.getUserBadgedLogoInfo( activityTaskManager: ActivityTaskManager, ): Pair<Drawable?, String> { // If the app sets customized icon/description, use the passed-in value directly - var icon: Drawable? = - if (prompt.logoBitmap != null) BitmapDrawable(resources, prompt.logoBitmap) else null + val customizedIcon: Drawable? = + prompt.logoBitmap?.let { BitmapDrawable(resources, prompt.logoBitmap) } + var icon = customizedIcon var label = prompt.logoDescription ?: "" if (icon != null && label.isNotEmpty()) { return Pair(icon, label) @@ -1009,12 +1010,11 @@ private fun Context.getUserBadgedLogoInfo( } } - // Add user badge + // Add user badge for non-customized logo icon val userHandle = UserHandle.of(prompt.userInfo.userId) - if (label.isNotEmpty()) { - label = packageManager.getUserBadgedLabel(label, userHandle).toString() + if (icon != null && icon != customizedIcon) { + icon = packageManager.getUserBadgedIcon(icon, userHandle) } - icon = icon?.let { packageManager.getUserBadgedIcon(it, userHandle) } return Pair(icon, label) } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt index c2a4ee36dec6..555716191c96 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt @@ -164,21 +164,12 @@ constructor( showIndicatorForDeviceEntry: Boolean -> val callbacks = mutableListOf<LottieCallback>() if (showIndicatorForDeviceEntry) { - val indicatorColor = - com.android.settingslib.Utils.getColorAttrDefaultColor( - applicationContext, - com.android.internal.R.attr.materialColorPrimaryFixed - ) - val outerRimColor = - com.android.settingslib.Utils.getColorAttrDefaultColor( - applicationContext, - com.android.internal.R.attr.materialColorPrimaryFixedDim - ) - val chevronFill = - com.android.settingslib.Utils.getColorAttrDefaultColor( - applicationContext, - com.android.internal.R.attr.materialColorOnPrimaryFixed - ) + val indicatorColor = applicationContext.getColor( + com.android.internal.R.color.materialColorPrimaryFixed) + val outerRimColor = applicationContext.getColor( + com.android.internal.R.color.materialColorPrimaryFixedDim) + val chevronFill = applicationContext.getColor( + com.android.internal.R.color.materialColorOnPrimaryFixed) callbacks.add(LottieCallback(KeyPath(".blue600", "**"), indicatorColor)) callbacks.add(LottieCallback(KeyPath(".blue400", "**"), outerRimColor)) callbacks.add(LottieCallback(KeyPath(".black", "**"), chevronFill)) diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt index d7a0fc9770ee..9cfb5be478ed 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt @@ -405,13 +405,10 @@ internal constructor( } // updating icon colors - val tintColor = - com.android.settingslib.Utils.getColorAttr( - context, - if (item.isActive) InternalR.attr.materialColorOnPrimaryContainer - else InternalR.attr.materialColorOnSurface, - ) - .defaultColor + val tintColor = context.getColor( + if (item.isActive) InternalR.color.materialColorOnPrimaryContainer + else InternalR.color.materialColorOnSurface + ) // update icons iconView.apply { diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt index a42ae03b2c4e..cdd1b3c3cf54 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt @@ -18,7 +18,6 @@ package com.android.systemui.bouncer.data.repository import android.content.res.Resources import com.android.internal.R -import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application @@ -37,7 +36,7 @@ class EmergencyServicesRepository constructor( @Application private val applicationScope: CoroutineScope, @Main private val resources: Resources, - @GlobalConfig configurationRepository: ConfigurationRepository, + @Main configurationRepository: ConfigurationRepository, ) { /** * Whether to enable emergency services calls while the SIM card is locked. This is disabled in @@ -49,7 +48,7 @@ constructor( .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, - initialValue = getEnableEmergencyCallWhileSimLocked() + initialValue = getEnableEmergencyCallWhileSimLocked(), ) private fun getEnableEmergencyCallWhileSimLocked(): Boolean { diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt b/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt index 9f1781177f7a..a286d16826cd 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt @@ -33,13 +33,15 @@ object KeyguardBouncerConstants { const val DEFAULT_PIN_LENGTH = 6 object ColorId { - const val TITLE = com.android.internal.R.attr.materialColorOnSurface - const val PIN_SHAPES = com.android.internal.R.attr.materialColorOnSurfaceVariant - const val NUM_PAD_BACKGROUND = com.android.internal.R.attr.materialColorSurfaceContainerHigh - const val NUM_PAD_BACKGROUND_PRESSED = com.android.internal.R.attr.materialColorPrimaryFixed - const val NUM_PAD_PRESSED = com.android.internal.R.attr.materialColorOnPrimaryFixed - const val NUM_PAD_KEY = com.android.internal.R.attr.materialColorOnSurface - const val NUM_PAD_BUTTON = com.android.internal.R.attr.materialColorOnSecondaryFixed - const val EMERGENCY_BUTTON = com.android.internal.R.attr.materialColorTertiaryFixed + const val TITLE = com.android.internal.R.color.materialColorOnSurface + const val PIN_SHAPES = com.android.internal.R.color.materialColorOnSurfaceVariant + const val NUM_PAD_BACKGROUND = + com.android.internal.R.color.materialColorSurfaceContainerHigh + const val NUM_PAD_BACKGROUND_PRESSED = + com.android.internal.R.color.materialColorPrimaryFixed + const val NUM_PAD_PRESSED = com.android.internal.R.color.materialColorOnPrimaryFixed + const val NUM_PAD_KEY = com.android.internal.R.color.materialColorOnSurface + const val NUM_PAD_BUTTON = com.android.internal.R.color.materialColorOnSecondaryFixed + const val EMERGENCY_BUTTON = com.android.internal.R.color.materialColorTertiaryFixed } } diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt b/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt index d235c95eb906..d53a737480a3 100644 --- a/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt +++ b/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt @@ -18,6 +18,7 @@ package com.android.systemui.common.shared.model import android.annotation.AttrRes import android.annotation.ColorInt +import android.annotation.ColorRes /** * Models a color that can be either a specific [Color.Loaded] value or a resolvable theme @@ -28,4 +29,6 @@ sealed interface Color { data class Loaded(@ColorInt val color: Int) : Color data class Attribute(@AttrRes val attribute: Int) : Color + + data class Resource(@ColorRes val colorRes: Int) : Color } diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt b/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt index 0869351e727b..6a6c3eb05399 100644 --- a/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt +++ b/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt @@ -16,10 +16,10 @@ package com.android.systemui.common.shared.model -import androidx.annotation.AttrRes +import androidx.annotation.ColorRes /** Models an icon with a specific tint. */ data class TintedIcon( val icon: Icon, - @AttrRes val tint: Int?, + @ColorRes val tint: Int?, ) diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt b/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt index 7f50e4a06022..ad504d502847 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt @@ -21,21 +21,11 @@ import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractorImpl import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.statusbar.policy.ConfigurationController import dagger.Binds import dagger.Module import dagger.Provides -import javax.inject.Qualifier - -/** - * Annotates elements that provide information from the global configuration. - * - * The global configuration is the one associated with the main display. Secondary displays will - * apply override to the global configuration. Elements annotated with this shouldn't be used for - * secondary displays. - */ -@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class GlobalConfig @Module interface ConfigurationModule { @@ -45,32 +35,32 @@ interface ConfigurationModule { * now, without annotation the global config associated state is provided. */ @Binds - @Deprecated("Use the @GlobalConfig annotated one instead of this.") + @Deprecated("Use the @Main annotated one instead of this.") fun provideGlobalConfigurationState( - @GlobalConfig configurationState: ConfigurationState + @Main configurationState: ConfigurationState ): ConfigurationState @Binds - @Deprecated("Use the @GlobalConfig annotated one instead of this.") + @Deprecated("Use the @Main annotated one instead of this.") fun provideDefaultConfigurationState( - @GlobalConfig configurationState: ConfigurationInteractor + @Main configurationState: ConfigurationInteractor ): ConfigurationInteractor companion object { @SysUISingleton @Provides - @GlobalConfig + @Main fun provideGlobalConfigurationState( configStateFactory: ConfigurationStateImpl.Factory, configurationController: ConfigurationController, - @Application context: Context, + @Main context: Context, ): ConfigurationState { return configStateFactory.create(context, configurationController) } @SysUISingleton @Provides - @GlobalConfig + @Main fun provideGlobalConfigurationInteractor( configurationRepository: ConfigurationRepository ): ConfigurationInteractor { diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt index df891523798f..4d804d06fe87 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt @@ -23,9 +23,9 @@ import android.view.DisplayInfo import androidx.annotation.DimenRes import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow -import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.wrapper.DisplayUtilsWrapper import dagger.Binds @@ -162,19 +162,19 @@ abstract class ConfigurationRepositoryModule { * injected. */ @Binds - @Deprecated("Use the ConfigurationRepository annotated with @GlobalConfig instead.") + @Deprecated("Use the ConfigurationRepository annotated with @Main instead.") @SysUISingleton abstract fun provideDefaultConfigRepository( - @GlobalConfig configurationRepository: ConfigurationRepository + @Main configurationRepository: ConfigurationRepository ): ConfigurationRepository companion object { @Provides - @GlobalConfig + @Main @SysUISingleton fun provideGlobalConfigRepository( context: Context, - @GlobalConfig configurationController: ConfigurationController, + @Main configurationController: ConfigurationController, factory: ConfigurationRepositoryImpl.Factory, ): ConfigurationRepository { return factory.create(context, configurationController) diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt index 5ecf2e6b2551..a339af3694e7 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt @@ -195,7 +195,7 @@ abstract class BaseCommunalViewModel( open fun onDismissCtaTile() {} /** Called as the user starts dragging a widget to reorder. */ - open fun onReorderWidgetStart() {} + open fun onReorderWidgetStart(draggingItemKey: String) {} /** Called as the user finishes dragging a widget to reorder. */ open fun onReorderWidgetEnd() {} diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt index 736ed5c7d336..52bf0004cbe4 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt @@ -164,9 +164,8 @@ constructor( ) } - override fun onReorderWidgetStart() { - // Clear selection status - setSelectedKey(null) + override fun onReorderWidgetStart(draggingItemKey: String) { + setSelectedKey(draggingItemKey) _reorderingWidgets.value = true uiEventLogger.log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_START) } diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt index eb7420f76f59..83bd265db5f6 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt @@ -22,6 +22,7 @@ import android.os.Bundle import android.view.View import android.view.accessibility.AccessibilityNodeInfo import com.android.app.tracing.coroutines.launchTraced as launch +import com.android.systemui.Flags import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor @@ -293,6 +294,10 @@ constructor( } override fun onLongClick() { + if (Flags.glanceableHubDirectEditMode()) { + onOpenWidgetEditor(false) + return + } setCurrentPopupType(PopupType.CustomizeWidgetButton) } diff --git a/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt b/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt index 421774462974..481acc935f41 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt @@ -18,7 +18,6 @@ package com.android.systemui.communal.util import android.content.Context import android.graphics.Color -import com.android.settingslib.Utils import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application @@ -54,9 +53,6 @@ constructor( private fun loadBackgroundColor(): Color = Color.valueOf( - Utils.getColorAttrDefaultColor( - context, - com.android.internal.R.attr.materialColorPrimary - ) + context.getColor(com.android.internal.R.color.materialColorPrimary) ) } diff --git a/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java b/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java index 8527dcb3794f..35592a5d87d9 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java +++ b/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java @@ -29,6 +29,7 @@ import android.view.View; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.Observer; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.dreams.DreamOverlayStateController; @@ -58,6 +59,14 @@ public class ComplicationHostViewController extends ViewController<ConstraintLay private final LifecycleOwner mLifecycleOwner; private final ComplicationCollectionViewModel mComplicationCollectionViewModel; private final HashMap<ComplicationId, Complication.ViewHolder> mComplications = new HashMap<>(); + + private final Observer<Collection<ComplicationViewModel>> mComplicationViewModelObserver = + new Observer<>() { + @Override + public void onChanged(Collection<ComplicationViewModel> complicationViewModels) { + updateComplications(complicationViewModels); + } + }; @VisibleForTesting boolean mIsAnimationEnabled; @@ -80,13 +89,6 @@ public class ComplicationHostViewController extends ViewController<ConstraintLay Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f, UserHandle.USER_CURRENT) != 0.0f; } - @Override - protected void onInit() { - super.onInit(); - mComplicationCollectionViewModel.getComplications().observe(mLifecycleOwner, - complicationViewModels -> updateComplications(complicationViewModels)); - } - /** * Returns the region in display space occupied by complications. Touches in this region * (composed of a collection of individual rectangular regions) should be directed to the @@ -166,10 +168,14 @@ public class ComplicationHostViewController extends ViewController<ConstraintLay @Override protected void onViewAttached() { + mComplicationCollectionViewModel.getComplications().observe(mLifecycleOwner, + mComplicationViewModelObserver); } @Override protected void onViewDetached() { + mComplicationCollectionViewModel.getComplications().removeObserver( + mComplicationViewModelObserver); } /** diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index 78a8a42e2743..9ae106c3ab39 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java @@ -708,6 +708,14 @@ public class FrameworkServicesModule { return context.getSystemService(WindowManager.class); } + /** A window manager working for the default display only. */ + @Provides + @Singleton + @Main + static WindowManager provideMainWindowManager(WindowManager windowManager) { + return windowManager; + } + @Provides @Singleton static ViewCaptureAwareWindowManager provideViewCaptureAwareWindowManager( diff --git a/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java b/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java index 3072f74dff2b..ddc88a839a63 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java @@ -21,6 +21,7 @@ import android.util.DisplayMetrics; import android.view.Display; import com.android.systemui.dagger.qualifiers.Application; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.PluginsModule; import com.android.systemui.unfold.UnfoldTransitionModule; import com.android.systemui.util.concurrency.GlobalConcurrencyModule; @@ -62,6 +63,13 @@ public class GlobalModule { return context.getApplicationContext(); } + /** Provides the default content with the main annotation. */ + @Provides + @Main + public Context provideMainContext(Context context) { + return context; + } + /** * @deprecated Deprecdated because {@link Display#getMetrics} is deprecated. */ diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java index 580896cb534e..00eead6eb7fc 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java @@ -21,7 +21,7 @@ import com.android.systemui.CoreStartable; import com.android.systemui.Dependency; import com.android.systemui.InitController; import com.android.systemui.SystemUIAppComponentFactoryBase; -import com.android.systemui.common.ui.GlobalConfig; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.PerUser; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardSliceProvider; @@ -128,14 +128,14 @@ public interface SysUIComponent { * Creates a ConfigurationController. */ @SysUISingleton - @GlobalConfig + @Main ConfigurationController getConfigurationController(); /** * Creates a ConfigurationForwarder. */ @SysUISingleton - @GlobalConfig + @Main ConfigurationForwarder getConfigurationForwarder(); /** diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java index ba579188a8c9..673ee6dda259 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java @@ -37,6 +37,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.dagger.DozeScope; import com.android.systemui.doze.dagger.WrappedService; import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.keyguard.domain.interactor.DozeInteractor; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; import com.android.systemui.util.wakelock.SettableWakeLock; import com.android.systemui.util.wakelock.WakeLock; @@ -82,6 +83,7 @@ public class DozeScreenState implements DozeMachine.Part { private final DozeLog mDozeLog; private final DozeScreenBrightness mDozeScreenBrightness; private final SelectedUserInteractor mSelectedUserInteractor; + private final DozeInteractor mDozeInteractor; private int mPendingScreenState = Display.STATE_UNKNOWN; private SettableWakeLock mWakeLock; @@ -97,6 +99,7 @@ public class DozeScreenState implements DozeMachine.Part { Provider<UdfpsController> udfpsControllerProvider, DozeLog dozeLog, DozeScreenBrightness dozeScreenBrightness, + DozeInteractor dozeInteractor, SelectedUserInteractor selectedUserInteractor) { mDozeService = service; mHandler = handler; @@ -108,6 +111,7 @@ public class DozeScreenState implements DozeMachine.Part { mDozeLog = dozeLog; mDozeScreenBrightness = dozeScreenBrightness; mSelectedUserInteractor = selectedUserInteractor; + mDozeInteractor = dozeInteractor; updateUdfpsController(); if (mUdfpsController == null) { @@ -225,6 +229,7 @@ public class DozeScreenState implements DozeMachine.Part { if (screenState != Display.STATE_UNKNOWN) { if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")"); mDozeService.setDozeScreenState(screenState); + mDozeInteractor.setDozeScreenState(screenState); if (screenState == Display.STATE_DOZE) { // If we're entering doze, update the doze screen brightness. We might have been // clamping it to the dim brightness during the screen off animation, and we should diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt index 1e9be09bc3f3..246f6571f2da 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt @@ -17,7 +17,6 @@ package com.android.systemui.keyboard.backlight.ui.view -import android.annotation.AttrRes import android.annotation.ColorInt import android.app.Dialog import android.content.Context @@ -38,7 +37,6 @@ import android.widget.LinearLayout.LayoutParams import android.widget.LinearLayout.LayoutParams.WRAP_CONTENT import androidx.annotation.IdRes import androidx.core.view.setPadding -import com.android.settingslib.Utils import com.android.systemui.res.R class KeyboardBacklightDialog( @@ -80,25 +78,25 @@ class KeyboardBacklightDialog( @ColorInt private val filledRectangleColor = - getColorFromStyle(com.android.internal.R.attr.materialColorPrimary) + context.getColor(com.android.internal.R.color.materialColorPrimary) @ColorInt private val emptyRectangleColor = - getColorFromStyle(com.android.internal.R.attr.materialColorOutlineVariant) + context.getColor(com.android.internal.R.color.materialColorOutlineVariant) @ColorInt private val backgroundColor = - getColorFromStyle(com.android.internal.R.attr.materialColorSurfaceBright) + context.getColor(com.android.internal.R.color.materialColorSurfaceBright) @ColorInt private val defaultIconColor = - getColorFromStyle(com.android.internal.R.attr.materialColorOnPrimary) + context.getColor(com.android.internal.R.color.materialColorOnPrimary) @ColorInt private val defaultIconBackgroundColor = - getColorFromStyle(com.android.internal.R.attr.materialColorPrimary) + context.getColor(com.android.internal.R.color.materialColorPrimary) @ColorInt private val dimmedIconColor = - getColorFromStyle(com.android.internal.R.attr.materialColorOnSurface) + context.getColor(com.android.internal.R.color.materialColorOnSurface) @ColorInt private val dimmedIconBackgroundColor = - getColorFromStyle(com.android.internal.R.attr.materialColorSurfaceDim) + context.getColor(com.android.internal.R.color.materialColorSurfaceDim) private val levelContentDescription = context.getString(R.string.keyboard_backlight_value) @@ -153,11 +151,6 @@ class KeyboardBacklightDialog( } } - @ColorInt - fun getColorFromStyle(@AttrRes colorId: Int): Int { - return Utils.getColorAttrDefaultColor(context, colorId) - } - fun updateState(current: Int, max: Int, forceRefresh: Boolean = false) { if (maxLevel != max || forceRefresh) { maxLevel = max diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt index 84a423e226b4..c3e6f0c6b280 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt @@ -21,11 +21,10 @@ import android.view.Surface import android.view.WindowManager import com.android.app.tracing.coroutines.launchTraced as launch import com.android.settingslib.Utils -import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyboard.docking.domain.interactor.KeyboardDockingIndicationInteractor import com.android.systemui.surfaceeffects.glowboxeffect.GlowBoxConfig import javax.inject.Inject @@ -37,10 +36,10 @@ import kotlinx.coroutines.flow.asStateFlow class KeyboardDockingIndicationViewModel @Inject constructor( - private val windowManager: WindowManager, - @Application private val context: Context, + @Main private val windowManager: WindowManager, + @Main private val context: Context, keyboardDockingIndicationInteractor: KeyboardDockingIndicationInteractor, - @GlobalConfig configurationInteractor: ConfigurationInteractor, + @Main configurationInteractor: ConfigurationInteractor, @Background private val backgroundScope: CoroutineScope, ) { diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/OWNERS b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/OWNERS new file mode 100644 index 000000000000..2355c48158f7 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 1562219 +chrisgollner@google.com +jmokut@google.com
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt index 30a2f330edf6..d7be5e622276 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt @@ -136,10 +136,6 @@ class InputGestureMaps @Inject constructor(private val context: Context) { KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT to R.string.system_multitasking_lhs, KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT to R.string.system_multitasking_rhs, KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION to R.string.system_multitasking_full_screen, - KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT to - R.string.system_multitasking_splitscreen_focus_lhs, - KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT to - R.string.system_multitasking_splitscreen_focus_rhs, ) val shortcutLabelToKeyGestureTypeMap: Map<String, Int> diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt index df6b04e2afd3..d785b5b5a7e7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt @@ -26,7 +26,6 @@ import android.view.KeyEvent.KEYCODE_EQUALS import android.view.KeyEvent.KEYCODE_LEFT_BRACKET import android.view.KeyEvent.KEYCODE_MINUS import android.view.KeyEvent.KEYCODE_RIGHT_BRACKET -import android.view.KeyEvent.META_ALT_ON import android.view.KeyEvent.META_CTRL_ON import android.view.KeyEvent.META_META_ON import android.view.KeyboardShortcutGroup @@ -74,20 +73,6 @@ constructor(@Main private val resources: Resources, @Application private val con command(META_META_ON or META_CTRL_ON, KEYCODE_DPAD_UP) } ) - // Change split screen focus to RHS: - // - Meta + Alt + Right arrow - add( - shortcutInfo(resources.getString(R.string.system_multitasking_splitscreen_focus_rhs)) { - command(META_META_ON or META_ALT_ON, KEYCODE_DPAD_RIGHT) - } - ) - // Change split screen focus to LHS: - // - Meta + Alt + Left arrow - add( - shortcutInfo(resources.getString(R.string.system_multitasking_splitscreen_focus_lhs)) { - command(META_META_ON or META_ALT_ON, KEYCODE_DPAD_LEFT) - } - ) if (enableMoveToNextDisplayShortcut()) { // Move a window to the next display: // - Meta + Ctrl + D diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt index 272491850c9c..af6f0cb2ec83 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt @@ -615,7 +615,7 @@ private fun Shortcut( } .focusable(interactionSource = interactionSource) .padding(8.dp) - .semantics { contentDescription = shortcut.contentDescription } + .semantics(mergeDescendants = true) { contentDescription = shortcut.contentDescription } ) { Row( modifier = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DozeInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DozeInteractor.kt index d04e4f1171a0..7c8bca8d9eb1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DozeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DozeInteractor.kt @@ -17,8 +17,11 @@ package com.android.systemui.keyguard.domain.interactor import android.graphics.Point +import android.view.Display import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.data.repository.KeyguardRepository +import com.android.systemui.power.data.repository.PowerRepository +import com.android.systemui.power.shared.model.DozeScreenStateModel import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes @@ -30,6 +33,7 @@ class DozeInteractor @Inject constructor( private val keyguardRepository: KeyguardRepository, + private val powerRepository: PowerRepository, // TODO(b/336364825) Remove Lazy when SceneContainerFlag is released - // while the flag is off, creating this object too early results in a crash private val sceneInteractor: Lazy<SceneInteractor>, @@ -41,6 +45,20 @@ constructor( return sceneInteractor.get().currentScene.value == Scenes.Lockscreen } + fun setDozeScreenState(state: Int) { + powerRepository.dozeScreenState.value = + when (state) { + Display.STATE_UNKNOWN -> DozeScreenStateModel.UNKNOWN + Display.STATE_OFF -> DozeScreenStateModel.OFF + Display.STATE_ON -> DozeScreenStateModel.ON + Display.STATE_DOZE -> DozeScreenStateModel.DOZE + Display.STATE_DOZE_SUSPEND -> DozeScreenStateModel.DOZE_SUSPEND + Display.STATE_VR -> DozeScreenStateModel.VR + Display.STATE_ON_SUSPEND -> DozeScreenStateModel.ON_SUSPEND + else -> throw IllegalArgumentException("Invalid DozeScreenState: $state") + } + } + fun setAodAvailable(value: Boolean) { keyguardRepository.setAodAvailable(value) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt index 0cb8dd4798fa..5c03d65e570f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt @@ -36,7 +36,6 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull /** @@ -51,17 +50,11 @@ constructor( private val logger: KeyguardTransitionAnimationLogger, ) { /** Invoke once per transition between FROM->TO states to get access to a shared flow. */ - fun setup( - duration: Duration, - edge: Edge, - ): FlowBuilder { + fun setup(duration: Duration, edge: Edge): FlowBuilder { return FlowBuilder(duration, edge) } - inner class FlowBuilder( - private val transitionDuration: Duration, - private val edge: Edge, - ) { + inner class FlowBuilder(private val transitionDuration: Duration, private val edge: Edge) { fun setupWithoutSceneContainer(edge: Edge.StateToState): FlowBuilder { if (SceneContainerFlag.isEnabled) return this return setup(this.transitionDuration, edge) @@ -72,6 +65,8 @@ constructor( * in the range of [0, 1]. View animations should begin and end within a subset of this * range. This function maps the [startTime] and [duration] into [0, 1], when this subset is * valid. + * + * Note that [onCancel] isn't used when the scene framework is enabled. */ fun sharedFlow( duration: Duration, @@ -81,7 +76,7 @@ constructor( onCancel: (() -> Float)? = null, onFinish: (() -> Float)? = null, interpolator: Interpolator = LINEAR, - name: String? = null + name: String? = null, ): Flow<Float> { return sharedFlowWithState( duration = duration, @@ -113,7 +108,7 @@ constructor( onCancel: (() -> Float)? = null, onFinish: (() -> Float)? = null, interpolator: Interpolator = LINEAR, - name: String? = null + name: String? = null, ): Flow<StateToValue> { if (!duration.isPositive()) { throw IllegalArgumentException("duration must be a positive number: $duration") @@ -155,20 +150,40 @@ constructor( return transitionInteractor .transition(edge) - .map { step -> - StateToValue( - from = step.from, - to = step.to, - transitionState = step.transitionState, - value = - when (step.transitionState) { - STARTED -> stepToValue(step) - RUNNING -> stepToValue(step) - CANCELED -> onCancel?.invoke() - FINISHED -> onFinish?.invoke() - } - ) - .also { logger.logTransitionStep(name, step, it.value) } + .mapNotNull { step -> + if (SceneContainerFlag.isEnabled && step.transitionState == CANCELED) { + // When the scene framework is enabled, there's no need to emit an alpha + // value when the keyguard transition animation is canceled because there's + // always going to be a new, reversed keyguard transition animation back to + // the original KeyguardState that starts right when this one was canceled. + // + // For example, if swiping up slightly on the Lockscreen scene and then + // releasing before the transition to the Bouncer scene is committed, the + // KTF transition of LOCKSCREEN -> PRIMARY_BOUNCER received a CANCELED and + // the scene framework immediately starts a reversed transition of + // PRIMARY_BOUNCER -> LOCKSCREEN, which picks up where the previous one left + // off. + // + // If it were allowed for the CANCELED from the original KTF transition to + // emit a value, a race condition could form where the value from CANCELED + // arrives downstream _after_ the reversed transition is finished, causing + // the transition to end up in an incorrect state at rest. + null + } else { + StateToValue( + from = step.from, + to = step.to, + transitionState = step.transitionState, + value = + when (step.transitionState) { + STARTED -> stepToValue(step) + RUNNING -> stepToValue(step) + CANCELED -> onCancel?.invoke() + FINISHED -> onFinish?.invoke() + }, + ) + .also { logger.logTransitionStep(name, step, it.value) } + } } .distinctUntilChanged() } @@ -181,7 +196,7 @@ constructor( duration = 1.milliseconds, onStep = { value }, onCancel = { value }, - onFinish = { value } + onFinish = { value }, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt index 3bdf7dac75b3..c59fe5357ccb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.ui.binder import android.annotation.SuppressLint +import android.content.res.ColorStateList import android.graphics.Rect import android.graphics.drawable.Animatable2 import android.util.Size @@ -37,7 +38,6 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.app.animation.Interpolators import com.android.app.tracing.coroutines.launchTraced as launch -import com.android.settingslib.Utils import com.android.systemui.animation.ActivityTransitionAnimator import com.android.systemui.animation.Expandable import com.android.systemui.animation.view.LaunchableLinearLayout @@ -382,25 +382,25 @@ object KeyguardBottomAreaViewBinder { view.isActivated = viewModel.isActivated view.drawable.setTint( - Utils.getColorAttrDefaultColor( - view.context, + view.context.getColor( if (viewModel.isActivated) { - com.android.internal.R.attr.materialColorOnPrimaryFixed + com.android.internal.R.color.materialColorOnPrimaryFixed } else { - com.android.internal.R.attr.materialColorOnSurface - }, + com.android.internal.R.color.materialColorOnSurface + } ) ) view.backgroundTintList = if (!viewModel.isSelected) { - Utils.getColorAttr( - view.context, - if (viewModel.isActivated) { - com.android.internal.R.attr.materialColorPrimaryFixed - } else { - com.android.internal.R.attr.materialColorSurfaceContainerHigh - } + ColorStateList.valueOf( + view.context.getColor( + if (viewModel.isActivated) { + com.android.internal.R.color.materialColorPrimaryFixed + } else { + com.android.internal.R.color.materialColorSurfaceContainerHigh + } + ) ) } else { null diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt index 191e08b0de77..5c8a234ec6c4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt @@ -18,6 +18,7 @@ package com.android.systemui.keyguard.ui.binder import android.annotation.SuppressLint +import android.content.res.ColorStateList import android.graphics.drawable.Animatable2 import android.util.Size import android.view.View @@ -32,7 +33,6 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.keyguard.logging.KeyguardQuickAffordancesLogger -import com.android.settingslib.Utils import com.android.systemui.animation.Expandable import com.android.systemui.animation.view.LaunchableImageView import com.android.systemui.common.shared.model.Icon @@ -176,25 +176,25 @@ constructor( view.isActivated = viewModel.isActivated view.drawable.setTint( - Utils.getColorAttrDefaultColor( - view.context, + view.context.getColor( if (viewModel.isActivated) { - com.android.internal.R.attr.materialColorOnPrimaryFixed + com.android.internal.R.color.materialColorOnPrimaryFixed } else { - com.android.internal.R.attr.materialColorOnSurface + com.android.internal.R.color.materialColorOnSurface }, ) ) view.backgroundTintList = if (!viewModel.isSelected) { - Utils.getColorAttr( - view.context, - if (viewModel.isActivated) { - com.android.internal.R.attr.materialColorPrimaryFixed - } else { - com.android.internal.R.attr.materialColorSurfaceContainerHigh - } + ColorStateList.valueOf( + view.context.getColor( + if (viewModel.isActivated) { + com.android.internal.R.color.materialColorPrimaryFixed + } else { + com.android.internal.R.color.materialColorSurfaceContainerHigh + } + ) ) } else { null diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt index 2a9fe8314349..1e99697e6a33 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt @@ -93,7 +93,7 @@ constructor( scrubbing = false, elapsedTime = null, duration = 0, - listening = false + listening = false, ) set(value) { val enabledChanged = value.enabled != field.enabled @@ -135,7 +135,6 @@ constructor( override fun onMetadataChanged(metadata: MediaMetadata?) { if (!Flags.mediaControlsPostsOptimization()) return - val (enabled, duration) = getEnabledStateAndDuration(metadata) if (_data.duration != duration) { _data = _data.copy(enabled = enabled, duration = duration) @@ -323,7 +322,7 @@ constructor( bgExecutor.executeRepeatedly( this::checkPlaybackPosition, 0L, - POSITION_UPDATE_INTERVAL_MILLIS + POSITION_UPDATE_INTERVAL_MILLIS, ) cancel = Runnable { cancelPolling.run() @@ -331,6 +330,7 @@ constructor( } } } else { + checkPlaybackPosition() cancel?.run() cancel = null } @@ -542,7 +542,7 @@ constructor( eventStart: MotionEvent?, event: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { return shouldGoToSeekBar } @@ -556,7 +556,7 @@ constructor( eventStart: MotionEvent?, event: MotionEvent, velocityX: Float, - velocityY: Float + velocityY: Float, ): Boolean { if (Math.abs(velocityX) > flingVelocity || Math.abs(velocityY) > flingVelocity) { viewModel.onSeekFalse() diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt index 2f0e1298499c..f8d317a7799f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt @@ -19,12 +19,12 @@ package com.android.systemui.media.taptotransfer.common import android.content.Context import android.content.pm.PackageManager import android.graphics.drawable.Drawable -import androidx.annotation.AttrRes +import androidx.annotation.ColorRes import androidx.annotation.DrawableRes -import com.android.systemui.res.R import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.TintedIcon +import com.android.systemui.res.R import com.android.systemui.temporarydisplay.chipbar.ChipbarInfo.Companion.DEFAULT_ICON_TINT /** Utility methods for media tap-to-transfer. */ @@ -108,7 +108,7 @@ class MediaTttUtils { data class IconInfo( val contentDescription: ContentDescription, val icon: MediaTttIcon, - @AttrRes val tint: Int?, + @ColorRes val tint: Int?, /** * True if [drawable] is the app's icon, and false if [drawable] is some generic default icon. */ diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java index d2b1d5449aaf..8f04896fbb45 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java @@ -148,7 +148,7 @@ public class NavigationBarControllerImpl implements navBarHelper, navigationModeController, sysUiFlagsContainer, dumpManager, autoHideControllerStore.forDisplay(mContext.getDisplayId()), lightBarController, pipOptional, backAnimation.orElse(null), - taskStackChangeListeners); + taskStackChangeListeners, displayTracker); mIsLargeScreen = isLargeScreen(mContext); mIsPhone = determineIfPhone(mContext, deviceStateManager); dumpManager.registerDumpable(this); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 2a3aeae2a550..e9b7534f55e6 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -66,6 +66,7 @@ import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.statusbar.phone.BarTransitions; import com.android.systemui.shared.system.QuickStepContract; @@ -107,7 +108,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private LightBarTransitionsController mLightBarTransitionsController; private TaskStackChangeListeners mTaskStackChangeListeners; private Optional<Pip> mPipOptional; - private int mDisplayId; + private int mDefaultDisplayId; private int mNavigationIconHints; private final NavBarHelper.NavbarTaskbarStateUpdater mNavbarTaskbarStateUpdater = new NavBarHelper.NavbarTaskbarStateUpdater() { @@ -141,7 +142,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void onLockTaskModeChanged(int mode) { mSysUiState.setFlag(SYSUI_STATE_SCREEN_PINNING, mode == LOCK_TASK_MODE_PINNED) - .commitUpdate(mDisplayId); + .commitUpdate(mDefaultDisplayId); } }; @@ -159,7 +160,10 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private final AutoHideUiElement mAutoHideUiElement = new AutoHideUiElement() { @Override public void synchronizeState() { - checkNavBarModes(mDisplayId); + Display[] displays = mDisplayTracker.getAllDisplays(); + for (Display display : displays) { + checkNavBarModes(display.getDisplayId()); + } } @Override @@ -177,6 +181,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private final StatusBarStateController mStatusBarStateController; + private DisplayTracker mDisplayTracker; + @Inject public TaskbarDelegate(Context context, LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, @@ -203,7 +209,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, LightBarController lightBarController, Optional<Pip> pipOptional, BackAnimation backAnimation, - TaskStackChangeListeners taskStackChangeListeners) { + TaskStackChangeListeners taskStackChangeListeners, + DisplayTracker displayTracker) { // TODO: adding this in the ctor results in a dagger dependency cycle :( mCommandQueue = commandQueue; mOverviewProxyService = overviewProxyService; @@ -218,6 +225,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mLightBarTransitionsController = createLightBarTransitionsController(); mTaskStackChangeListeners = taskStackChangeListeners; mEdgeBackGestureHandler = navBarHelper.getEdgeBackGestureHandler(); + mDisplayTracker = displayTracker; } @Override @@ -255,7 +263,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, if (mInitialized) { return; } - mDisplayId = displayId; + mDefaultDisplayId = displayId; parseCurrentSysuiState(); mCommandQueue.addCallback(this); mOverviewProxyService.addCallback(this); @@ -315,7 +323,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private void parseCurrentSysuiState() { NavBarHelper.CurrentSysuiState state = mNavBarHelper.getCurrentSysuiState(); - if (state.mWindowStateDisplayId == mDisplayId) { + if (state.mWindowStateDisplayId == mDefaultDisplayId) { mTaskBarWindowState = state.mWindowState; } } @@ -340,7 +348,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, .setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isWindowVisible()) .setFlag(SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY, allowSystemGestureIgnoringBarVisibility()) - .commitUpdate(mDisplayId); + .commitUpdate(mDefaultDisplayId); } boolean isOverviewEnabled() { @@ -466,7 +474,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void setWindowState(int displayId, int window, int state) { - if (displayId == mDisplayId + if (displayId == mDefaultDisplayId && window == StatusBarManager.WINDOW_NAVIGATION_BAR && mTaskBarWindowState != state) { mTaskBarWindowState = state; @@ -498,7 +506,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, nbModeChanged = updateTransitionMode( transitionMode(mTaskbarTransientShowing, appearance)); } - if (displayId == mDisplayId) { + if (displayId == mDefaultDisplayId) { mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged, mTransitionMode, navbarColorManagedByIme); } @@ -510,7 +518,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { - if (displayId != mDisplayId) { + if (displayId != mDefaultDisplayId) { return; } if ((types & WindowInsets.Type.navigationBars()) == 0) { @@ -524,7 +532,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void abortTransient(int displayId, @InsetsType int types) { - if (displayId != mDisplayId) { + if (displayId != mDefaultDisplayId) { return; } if ((types & WindowInsets.Type.navigationBars()) == 0) { @@ -654,7 +662,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { - pw.println("TaskbarDelegate (displayId=" + mDisplayId + "):"); + pw.println("TaskbarDelegate (mDefaultDisplayId=" + mDefaultDisplayId + "):"); pw.println(" mNavigationIconHints=" + mNavigationIconHints); pw.println(" mNavigationMode=" + mNavigationMode); pw.println(" mDisabledFlags=" + mDisabledFlags); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt index 2d001508a720..138ac8668a14 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt @@ -12,7 +12,6 @@ import androidx.dynamicanimation.animation.FloatPropertyCompat import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce import com.android.internal.util.LatencyTracker -import com.android.settingslib.Utils import com.android.systemui.navigationbar.gestural.BackPanelController.DelayedOnAnimationEndListener private const val TAG = "BackPanel" @@ -156,23 +155,21 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : Configuration.UI_MODE_NIGHT_YES arrowPaint.color = - Utils.getColorAttrDefaultColor( - context, + context.getColor( if (isDeviceInNightTheme) { - com.android.internal.R.attr.materialColorOnSecondaryContainer + com.android.internal.R.color.materialColorOnSecondaryContainer } else { - com.android.internal.R.attr.materialColorOnSecondaryFixed - }, + com.android.internal.R.color.materialColorOnSecondaryFixed + } ) arrowBackgroundPaint.color = - Utils.getColorAttrDefaultColor( - context, + context.getColor( if (isDeviceInNightTheme) { - com.android.internal.R.attr.materialColorSecondaryContainer + com.android.internal.R.color.materialColorSecondaryContainer } else { - com.android.internal.R.attr.materialColorSecondaryFixedDim - }, + com.android.internal.R.color.materialColorSecondaryFixedDim + } ) } diff --git a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt index 82420875e0de..43bd6aa37b5a 100644 --- a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt @@ -27,6 +27,7 @@ import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLoggin import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.power.shared.model.DozeScreenStateModel import com.android.systemui.power.shared.model.ScreenPowerState import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.power.shared.model.WakefulnessModel @@ -64,6 +65,9 @@ interface PowerRepository { */ val screenPowerState: StateFlow<ScreenPowerState> + /** More granular display states, mainly for use in dozing. */ + val dozeScreenState: MutableStateFlow<DozeScreenStateModel> + /** Wakes up the device. */ fun wakeUp(why: String, @PowerManager.WakeReason wakeReason: Int) @@ -100,6 +104,8 @@ constructor( dispatcher: BroadcastDispatcher, ) : PowerRepository { + override val dozeScreenState = MutableStateFlow(DozeScreenStateModel.UNKNOWN) + override val isInteractive: Flow<Boolean> = conflatedCallbackFlow { fun send() { trySendWithFailureLogging(manager.isInteractive, TAG) diff --git a/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt b/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt index 1cf4c23415da..8a3ee1248f57 100644 --- a/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt @@ -24,6 +24,7 @@ import com.android.systemui.classifier.FalsingCollectorActual import com.android.systemui.dagger.SysUISingleton import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.PowerRepository +import com.android.systemui.power.shared.model.DozeScreenStateModel import com.android.systemui.power.shared.model.ScreenPowerState import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.power.shared.model.WakefulnessModel @@ -33,6 +34,7 @@ import javax.inject.Inject import javax.inject.Provider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map @@ -72,7 +74,11 @@ constructor( /** Helper flow in case "isAsleep" reads better than "!isAwake". */ val isAsleep = isAwake.map { !it } - val screenPowerState = repository.screenPowerState + /** The physical on/off state of the display. */ + val screenPowerState: StateFlow<ScreenPowerState> = repository.screenPowerState + + /** The screen state, related to power and controlled by [DozeScreenState] */ + val dozeScreenState: StateFlow<DozeScreenStateModel> = repository.dozeScreenState.asStateFlow() /** * Notifies the power interactor that a user touch happened. diff --git a/packages/SystemUI/src/com/android/systemui/power/shared/model/DozeScreenStateModel.kt b/packages/SystemUI/src/com/android/systemui/power/shared/model/DozeScreenStateModel.kt new file mode 100644 index 000000000000..510b90c071d8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/power/shared/model/DozeScreenStateModel.kt @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.systemui.power.shared.model + +/** Model device doze screen states. */ +enum class DozeScreenStateModel { + /** Doze components are set up. Followed by transition to DOZE or DOZE_AOD. */ + UNKNOWN, + /** Regular doze. Device is asleep and listening for pulse triggers. */ + OFF, + /** Deep doze. Device is asleep and is not listening for pulse triggers. */ + ON, + /** Always-on doze. Device is asleep, showing UI and listening for pulse triggers. */ + DOZE, + /** Pulse has been requested. Device is awake and preparing UI */ + DOZE_SUSPEND, + /** Pulse is showing. Device is awake and showing UI. */ + VR, + /** Pulse is showing with bright wallpaper. Device is awake and showing UI. */ + ON_SUSPEND, +} diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt index b26ae6cdf0bd..f53b6cd29806 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt @@ -40,8 +40,8 @@ import androidx.annotation.WorkerThread import androidx.core.view.ViewCompat import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import com.android.settingslib.Utils -import com.android.systemui.res.R import com.android.systemui.animation.ViewHierarchyAnimator +import com.android.systemui.res.R import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.util.maybeForceFullscreen import java.lang.ref.WeakReference @@ -347,16 +347,16 @@ class PrivacyDialogV2( private fun getForegroundColor(active: Boolean) = Utils.getColorAttrDefaultColor( context, - if (active) com.android.internal.R.attr.materialColorOnPrimaryFixed - else com.android.internal.R.attr.materialColorOnSurface + if (active) com.android.internal.R.color.materialColorOnPrimaryFixed + else com.android.internal.R.color.materialColorOnSurface, ) @ColorInt private fun getBackgroundColor(active: Boolean) = Utils.getColorAttrDefaultColor( context, - if (active) com.android.internal.R.attr.materialColorPrimaryFixed - else com.android.internal.R.attr.materialColorSurfaceContainerHigh + if (active) com.android.internal.R.color.materialColorPrimaryFixed + else com.android.internal.R.color.materialColorSurfaceContainerHigh, ) private fun getMutableDrawable(@DrawableRes resId: Int) = context.getDrawable(resId)!!.mutate() diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt index 5c9baa000d0b..91a3120ec770 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt @@ -141,6 +141,7 @@ interface FgsManagerController { class FgsManagerControllerImpl @Inject constructor( + @ShadeDisplayAware private val context: Context, @ShadeDisplayAware private val resources: Resources, @Main private val mainExecutor: Executor, @Background private val backgroundExecutor: Executor, @@ -387,7 +388,7 @@ constructor( override fun showDialog(expandable: Expandable?) { synchronized(lock) { if (dialog == null) { - val dialog = systemUIDialogFactory.create() + val dialog = systemUIDialogFactory.create(context) dialog.setTitle(R.string.fgs_manager_dialog_title) dialog.setMessage(R.string.fgs_manager_dialog_message) diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt index 8d9f49e55cea..56fece8ecf5c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt @@ -33,7 +33,6 @@ import androidx.activity.OnBackPressedDispatcherOwner import androidx.activity.setViewTreeOnBackPressedDispatcherOwner import androidx.annotation.VisibleForTesting import androidx.compose.animation.AnimatedContent -import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -49,6 +48,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeightIn import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -77,6 +77,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.CustomAccessibilityAction import androidx.compose.ui.semantics.customActions import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.round @@ -246,51 +247,57 @@ constructor( private fun Content() { PlatformTheme(isDarkTheme = true) { ProvideShortcutHelperIndication(interactionsConfig = interactionsConfig()) { - AnimatedVisibility( - visible = viewModel.isQsVisibleAndAnyShadeExpanded, - modifier = - Modifier.graphicsLayer { alpha = viewModel.viewAlpha } - // Clipping before translation to match QSContainerImpl.onDraw - .offset { - IntOffset(x = 0, y = viewModel.viewTranslationY.fastRoundToInt()) - } - .thenIf(notificationScrimClippingParams.isEnabled) { - Modifier.notificationScrimClip { - notificationScrimClippingParams.params + if (viewModel.isQsVisibleAndAnyShadeExpanded) { + Box( + modifier = + Modifier.graphicsLayer { alpha = viewModel.viewAlpha } + // Clipping before translation to match QSContainerImpl.onDraw + .offset { + IntOffset( + x = 0, + y = viewModel.viewTranslationY.fastRoundToInt(), + ) + } + .thenIf(notificationScrimClippingParams.isEnabled) { + Modifier.notificationScrimClip { + notificationScrimClippingParams.params + } } + // Disable touches in the whole composable while the mirror is + // showing. While the mirror is showing, an ancestor of the + // ComposeView is made alpha 0, but touches are still being captured + // by the composables. + .gesturesDisabled(viewModel.showingMirror) + ) { + val isEditing by + viewModel.containerViewModel.editModeViewModel.isEditing + .collectAsStateWithLifecycle() + val animationSpecEditMode = tween<Float>(EDIT_MODE_TIME_MILLIS) + AnimatedContent( + targetState = isEditing, + transitionSpec = { + fadeIn(animationSpecEditMode) togetherWith + fadeOut(animationSpecEditMode) + }, + label = "EditModeAnimatedContent", + ) { editing -> + if (editing) { + val qqsPadding = viewModel.qqsHeaderHeight + EditMode( + viewModel = viewModel.containerViewModel.editModeViewModel, + modifier = + Modifier.fillMaxWidth() + .padding(top = { qqsPadding }) + .padding( + horizontal = { + QuickSettingsShade.Dimensions.Padding + .roundToPx() + } + ), + ) + } else { + CollapsableQuickSettingsSTL() } - // Disable touches in the whole composable while the mirror is showing. - // While the mirror is showing, an ancestor of the ComposeView is made - // alpha 0, but touches are still being captured by the composables. - .gesturesDisabled(viewModel.showingMirror), - ) { - val isEditing by - viewModel.containerViewModel.editModeViewModel.isEditing - .collectAsStateWithLifecycle() - val animationSpecEditMode = tween<Float>(EDIT_MODE_TIME_MILLIS) - AnimatedContent( - targetState = isEditing, - transitionSpec = { - fadeIn(animationSpecEditMode) togetherWith - fadeOut(animationSpecEditMode) - }, - label = "EditModeAnimatedContent", - ) { editing -> - if (editing) { - val qqsPadding = viewModel.qqsHeaderHeight - EditMode( - viewModel = viewModel.containerViewModel.editModeViewModel, - modifier = - Modifier.fillMaxWidth() - .padding(top = { qqsPadding }) - .padding( - horizontal = { - QuickSettingsShade.Dimensions.Padding.roundToPx() - } - ), - ) - } else { - CollapsableQuickSettingsSTL() } } } @@ -325,9 +332,15 @@ constructor( } SceneTransitionLayout(state = sceneState, modifier = Modifier.fillMaxSize()) { - scene(QuickSettings) { QuickSettingsElement() } + scene(QuickSettings) { + LaunchedEffect(Unit) { viewModel.onQSOpen() } + QuickSettingsElement() + } - scene(QuickQuickSettings) { QuickQuickSettingsElement() } + scene(QuickQuickSettings) { + LaunchedEffect(Unit) { viewModel.onQQSOpen() } + QuickQuickSettingsElement() + } } } @@ -616,7 +629,14 @@ constructor( val Media = @Composable { if (viewModel.qqsMediaVisible) { - MediaObject(mediaHost = viewModel.qqsMediaHost) + MediaObject( + // In order to have stable constraints passed to the AndroidView + // during expansion (available height changing due to squishiness), + // We always allow the media here to be as tall as it wants. + // (b/383085298) + modifier = Modifier.requiredHeightIn(max = Dp.Infinity), + mediaHost = viewModel.qqsMediaHost, + ) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt index 3c725203a15f..07ceb6425574 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt @@ -28,6 +28,7 @@ import androidx.compose.runtime.snapshotFlow import androidx.lifecycle.LifecycleCoroutineScope import com.android.app.animation.Interpolators import com.android.app.tracing.coroutines.launchTraced as launch +import com.android.internal.logging.UiEventLogger import com.android.keyguard.BouncerPanelExpansionCalculator import com.android.systemui.Dumpable import com.android.systemui.animation.ShadeInterpolation @@ -51,6 +52,7 @@ import com.android.systemui.media.dagger.MediaModule.QS_PANEL import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.FooterActionsController +import com.android.systemui.qs.QSEvent import com.android.systemui.qs.composefragment.dagger.QSFragmentComposeLog import com.android.systemui.qs.composefragment.dagger.QSFragmentComposeModule import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel @@ -113,6 +115,7 @@ constructor( @Named(QUICK_QS_PANEL) val qqsMediaHost: MediaHost, @Named(QS_PANEL) val qsMediaHost: MediaHost, @Named(QSFragmentComposeModule.QS_USING_MEDIA_PLAYER) private val usingMedia: Boolean, + private val uiEventLogger: UiEventLogger, @Assisted private val lifecycleScope: LifecycleCoroutineScope, ) : Dumpable, ExclusiveActivatable() { @@ -455,6 +458,14 @@ constructor( falsingInteractor.isFalseTouch(Classifier.QS_SWIPE_NESTED) } + fun onQQSOpen() { + uiEventLogger.log(QSEvent.QQS_PANEL_EXPANDED) + } + + fun onQSOpen() { + uiEventLogger.log(QSEvent.QS_PANEL_EXPANDED) + } + override suspend fun onActivated(): Nothing { initMediaHosts() // init regardless of using media (same as current QS). coroutineScope { diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt index 35faa97db2fe..405ce8a8e5e0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt @@ -44,19 +44,28 @@ import com.android.systemui.qs.pipeline.shared.TileSpec /** Holds the [TileSpec] of the tile being moved and receives drag and drop events. */ interface DragAndDropState { val draggedCell: SizedTile<EditTileViewModel>? + val draggedPosition: Offset val dragInProgress: Boolean + val dragType: DragType? fun isMoving(tileSpec: TileSpec): Boolean - fun onStarted(cell: SizedTile<EditTileViewModel>) + fun onStarted(cell: SizedTile<EditTileViewModel>, dragType: DragType) - fun onMoved(target: Int, insertAfter: Boolean) + fun onTargeting(target: Int, insertAfter: Boolean) + + fun onMoved(offset: Offset) fun movedOutOfBounds() fun onDrop() } +enum class DragType { + Add, + Move, +} + /** * Registers a composable as a [DragAndDropTarget] to receive drop events. Use this outside the tile * grid to catch out of bounds drops. @@ -72,6 +81,10 @@ fun Modifier.dragAndDropRemoveZone( val target = remember(dragAndDropState) { object : DragAndDropTarget { + override fun onMoved(event: DragAndDropEvent) { + dragAndDropState.onMoved(event.toOffset()) + } + override fun onDrop(event: DragAndDropEvent): Boolean { return dragAndDropState.draggedCell?.let { onDrop(it.tile.tileSpec) @@ -117,8 +130,11 @@ fun Modifier.dragAndDropTileList( } override fun onMoved(event: DragAndDropEvent) { + val offset = event.toOffset() + dragAndDropState.onMoved(offset) + // Drag offset relative to the list's top left corner - val relativeDragOffset = event.dragOffsetRelativeTo(contentOffset()) + val relativeDragOffset = offset - contentOffset() val targetItem = gridState.layoutInfo.visibleItemsInfo.firstOrNull { item -> // Check if the drag is on this item @@ -126,7 +142,7 @@ fun Modifier.dragAndDropTileList( } targetItem?.let { - dragAndDropState.onMoved(it.index, insertAfter(it, relativeDragOffset)) + dragAndDropState.onTargeting(it.index, insertAfter(it, relativeDragOffset)) } } @@ -147,8 +163,8 @@ fun Modifier.dragAndDropTileList( ) } -private fun DragAndDropEvent.dragOffsetRelativeTo(offset: Offset): Offset { - return toAndroidDragEvent().run { Offset(x, y) } - offset +private fun DragAndDropEvent.toOffset(): Offset { + return toAndroidDragEvent().run { Offset(x, y) } } private fun insertAfter(item: LazyGridItemInfo, offset: Offset): Boolean { @@ -163,6 +179,7 @@ private fun insertAfter(item: LazyGridItemInfo, offset: Offset): Boolean { fun Modifier.dragAndDropTileSource( sizedTile: SizedTile<EditTileViewModel>, dragAndDropState: DragAndDropState, + dragType: DragType, onDragStart: () -> Unit, ): Modifier { val dragState by rememberUpdatedState(dragAndDropState) @@ -172,7 +189,7 @@ fun Modifier.dragAndDropTileSource( detectDragGesturesAfterLongPress( onDrag = { _, _ -> }, onDragStart = { - dragState.onStarted(sizedTile) + dragState.onStarted(sizedTile, dragType) onDragStart() // The tilespec from the ClipData transferred isn't actually needed as we're diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt index 14abfa2313d8..868855840922 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt @@ -17,10 +17,13 @@ package com.android.systemui.qs.panels.ui.compose import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.toMutableStateList +import androidx.compose.ui.geometry.Offset import com.android.systemui.qs.panels.shared.model.SizedTile import com.android.systemui.qs.panels.ui.model.GridCell import com.android.systemui.qs.panels.ui.model.TileGridCell @@ -48,12 +51,17 @@ class EditTileListState( private val columns: Int, private val largeTilesSpan: Int, ) : DragAndDropState { - private val _draggedCell = mutableStateOf<SizedTile<EditTileViewModel>?>(null) - override val draggedCell - get() = _draggedCell.value + override var draggedCell by mutableStateOf<SizedTile<EditTileViewModel>?>(null) + private set + + override var draggedPosition by mutableStateOf(Offset.Unspecified) + private set + + override var dragType by mutableStateOf<DragType?>(null) + private set override val dragInProgress: Boolean - get() = _draggedCell.value != null + get() = draggedCell != null private val _tiles: SnapshotStateList<GridCell> = tiles.toGridCells(columns).toMutableStateList() @@ -83,18 +91,19 @@ class EditTileListState( } override fun isMoving(tileSpec: TileSpec): Boolean { - return _draggedCell.value?.let { it.tile.tileSpec == tileSpec } ?: false + return draggedCell?.let { it.tile.tileSpec == tileSpec } ?: false } - override fun onStarted(cell: SizedTile<EditTileViewModel>) { - _draggedCell.value = cell + override fun onStarted(cell: SizedTile<EditTileViewModel>, dragType: DragType) { + draggedCell = cell + this.dragType = dragType // Add spacers to the grid to indicate where the user can move a tile regenerateGrid() } - override fun onMoved(target: Int, insertAfter: Boolean) { - val draggedTile = _draggedCell.value ?: return + override fun onTargeting(target: Int, insertAfter: Boolean) { + val draggedTile = draggedCell ?: return val fromIndex = indexOf(draggedTile.tile.tileSpec) if (fromIndex == target) { @@ -115,16 +124,26 @@ class EditTileListState( regenerateGrid() } + override fun onMoved(offset: Offset) { + draggedPosition = offset + } + override fun movedOutOfBounds() { - val draggedTile = _draggedCell.value ?: return + val draggedTile = draggedCell ?: return _tiles.removeIf { cell -> cell is TileGridCell && cell.tile.tileSpec == draggedTile.tile.tileSpec } + draggedPosition = Offset.Unspecified + + // Regenerate spacers without the dragged tile + regenerateGrid() } override fun onDrop() { - _draggedCell.value = null + draggedCell = null + draggedPosition = Offset.Unspecified + dragType = null // Remove the spacers regenerateGrid() diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt index a05747dd3ba2..d975f104d538 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt @@ -20,12 +20,16 @@ package com.android.systemui.qs.panels.ui.compose.infinitegrid import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.LocalOverscrollFactory +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clipScrollableContainer @@ -43,6 +47,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeightIn import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize @@ -69,6 +74,7 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -80,6 +86,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.isSpecified import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.MeasureScope @@ -111,6 +118,7 @@ import com.android.systemui.qs.panels.shared.model.SizedTile import com.android.systemui.qs.panels.shared.model.SizedTileImpl import com.android.systemui.qs.panels.ui.compose.BounceableInfo import com.android.systemui.qs.panels.ui.compose.DragAndDropState +import com.android.systemui.qs.panels.ui.compose.DragType import com.android.systemui.qs.panels.ui.compose.EditTileListState import com.android.systemui.qs.panels.ui.compose.bounceableInfo import com.android.systemui.qs.panels.ui.compose.dragAndDropRemoveZone @@ -120,6 +128,9 @@ import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults.TileArrangementPadding import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults.TileHeight import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults.ToggleTargetSize +import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AUTO_SCROLL_DISTANCE +import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AUTO_SCROLL_SPEED +import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AvailableTilesGridMinHeight import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.CurrentTilesGridPadding import com.android.systemui.qs.panels.ui.compose.selection.MutableSelectionState import com.android.systemui.qs.panels.ui.compose.selection.ResizableTileContainer @@ -139,8 +150,10 @@ import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.qs.shared.model.groupAndSort import com.android.systemui.res.R +import kotlin.math.abs import kotlin.math.roundToInt import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay object TileType @@ -201,8 +214,12 @@ fun DefaultEditTileGrid( ) { innerPadding -> CompositionLocalProvider(LocalOverscrollFactory provides null) { val scrollState = rememberScrollState() - LaunchedEffect(listState.dragInProgress) { - if (listState.dragInProgress) { + + AutoScrollGrid(listState, scrollState, innerPadding) + + LaunchedEffect(listState.dragType) { + // Only scroll to the top when adding a new tile, not when reordering existing ones + if (listState.dragInProgress && listState.dragType == DragType.Add) { scrollState.animateScrollTo(0) } } @@ -223,7 +240,7 @@ fun DefaultEditTileGrid( AnimatedContent( targetState = listState.dragInProgress, modifier = Modifier.wrapContentSize(), - label = "", + label = "QSEditHeader", ) { dragIsInProgress -> EditGridHeader(Modifier.dragAndDropRemoveZone(listState, onRemoveTile)) { if (dragIsInProgress) { @@ -243,34 +260,84 @@ fun DefaultEditTileGrid( onSetTiles, ) - // Hide available tiles when dragging - AnimatedVisibility( - visible = !listState.dragInProgress, - enter = fadeIn(), - exit = fadeOut(), + // Sets a minimum height to be used when available tiles are hidden + Box( + Modifier.fillMaxWidth() + .requiredHeightIn(AvailableTilesGridMinHeight) + .animateContentSize() + .dragAndDropRemoveZone(listState, onRemoveTile) ) { - Column( - verticalArrangement = - spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)), - modifier = modifier.fillMaxSize(), + // Using the fully qualified name here as a workaround for AnimatedVisibility + // not being available from a Box + androidx.compose.animation.AnimatedVisibility( + visible = !listState.dragInProgress, + enter = fadeIn(), + exit = fadeOut(), ) { - EditGridHeader { - Text(text = stringResource(id = R.string.drag_to_add_tiles)) - } + // Hide available tiles when dragging + Column( + verticalArrangement = + spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)), + modifier = modifier.fillMaxSize(), + ) { + EditGridHeader { + Text(text = stringResource(id = R.string.drag_to_add_tiles)) + } - AvailableTileGrid(otherTiles, selectionState, columns, listState) + AvailableTileGrid(otherTiles, selectionState, columns, listState) + } } } + } + } + } +} - // Drop zone to remove tiles dragged out of the tile grid - Spacer( - modifier = - Modifier.fillMaxWidth() - .weight(1f) - .dragAndDropRemoveZone(listState, onRemoveTile) - ) +@OptIn(ExperimentalCoroutinesApi::class) +@Composable +private fun AutoScrollGrid( + listState: EditTileListState, + scrollState: ScrollState, + padding: PaddingValues, +) { + val density = LocalDensity.current + val (top, bottom) = + remember(density) { + with(density) { + padding.calculateTopPadding().roundToPx() to + padding.calculateBottomPadding().roundToPx() + } + } + val scrollTarget by + remember(listState, scrollState, top, bottom) { + derivedStateOf { + val position = listState.draggedPosition + if (position.isSpecified) { + // Return the scroll target needed based on the position of the drag movement, + // or null if we don't need to scroll + val y = position.y.roundToInt() + when { + y < AUTO_SCROLL_DISTANCE + top -> 0 + y > scrollState.viewportSize - bottom - AUTO_SCROLL_DISTANCE -> + scrollState.maxValue + else -> null + } + } else { + null + } } } + LaunchedEffect(scrollTarget) { + scrollTarget?.let { + // Change the duration of the animation based on the distance to maintain the + // same scrolling speed + val distance = abs(it - scrollState.value) + scrollState.animateScrollTo( + it, + animationSpec = + tween(durationMillis = distance * AUTO_SCROLL_SPEED, easing = LinearEasing), + ) + } } } @@ -423,7 +490,7 @@ private fun AvailableTileGrid( } fun gridHeight(rows: Int, tileHeight: Dp, tilePadding: Dp, gridPadding: Dp): Dp { - return ((tileHeight + tilePadding) * rows) - tilePadding + gridPadding * 2 + return ((tileHeight + tilePadding) * rows) + gridPadding * 2 } private fun GridCell.key(index: Int, dragAndDropState: DragAndDropState): Any { @@ -596,6 +663,7 @@ private fun TileGridCell( .dragAndDropTileSource( SizedTileImpl(cell.tile, cell.width), dragAndDropState, + DragType.Move, selectionState::unSelect, ) .tileBackground(colors.background) @@ -631,7 +699,11 @@ private fun AvailableTileGridCell( onClick(onClickActionName) { false } this.stateDescription = stateDescription } - .dragAndDropTileSource(SizedTileImpl(cell.tile, cell.width), dragAndDropState) { + .dragAndDropTileSource( + SizedTileImpl(cell.tile, cell.width), + dragAndDropState, + DragType.Add, + ) { selectionState.unSelect() } .tileBackground(colors.background) @@ -739,7 +811,10 @@ private fun Modifier.tileBackground(color: Color): Modifier { private object EditModeTileDefaults { const val PLACEHOLDER_ALPHA = .3f + const val AUTO_SCROLL_DISTANCE = 100 + const val AUTO_SCROLL_SPEED = 2 // 2ms per pixel val CurrentTilesGridPadding = 8.dp + val AvailableTilesGridMinHeight = 200.dp @Composable fun editTileColors(): TileColors = diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt index faab6960a99c..f7ed1adecb34 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt @@ -18,9 +18,14 @@ package com.android.systemui.qs.panels.ui.viewmodel import android.content.Context import androidx.compose.ui.util.fastMap +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListUpdateCallback +import com.android.internal.logging.UiEventLogger import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.qs.QSEditEvent import com.android.systemui.qs.panels.domain.interactor.EditTilesListInteractor import com.android.systemui.qs.panels.domain.interactor.GridLayoutTypeInteractor import com.android.systemui.qs.panels.domain.interactor.TilesAvailabilityInteractor @@ -30,10 +35,12 @@ import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor.Companion.POSITION_AT_END import com.android.systemui.qs.pipeline.domain.interactor.MinimumTilesInteractor import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.pipeline.shared.metricSpec import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.util.kotlin.emitOnStart import javax.inject.Inject import javax.inject.Named +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow @@ -45,6 +52,7 @@ import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch @SysUISingleton @OptIn(ExperimentalCoroutinesApi::class) @@ -55,10 +63,12 @@ constructor( private val currentTilesInteractor: CurrentTilesInteractor, private val tilesAvailabilityInteractor: TilesAvailabilityInteractor, private val minTilesInteractor: MinimumTilesInteractor, + private val uiEventLogger: UiEventLogger, @ShadeDisplayAware private val configurationInteractor: ConfigurationInteractor, - @ShadeDisplayAware private val context: Context, + @ShadeDisplayAware private val context: Context, @Named("Default") private val defaultGridLayout: GridLayout, @Application private val applicationScope: CoroutineScope, + @Background private val bgDispatcher: CoroutineDispatcher, gridLayoutTypeInteractor: GridLayoutTypeInteractor, gridLayoutMap: Map<GridLayoutType, @JvmSuppressWildcards GridLayout>, ) { @@ -149,11 +159,17 @@ constructor( /** @see isEditing */ fun startEditing() { + if (!isEditing.value) { + uiEventLogger.log(QSEditEvent.QS_EDIT_OPEN) + } _isEditing.value = true } /** @see isEditing */ fun stopEditing() { + if (isEditing.value) { + uiEventLogger.log(QSEditEvent.QS_EDIT_CLOSED) + } _isEditing.value = false } @@ -164,6 +180,7 @@ constructor( fun addTile(tileSpec: TileSpec, position: Int = POSITION_AT_END) { val specs = currentTilesInteractor.currentTilesSpecs.toMutableList() val currentPosition = specs.indexOf(tileSpec) + val moved = currentPosition != -1 if (currentPosition != -1) { // No operation needed if the element is already in the list at the right position @@ -179,6 +196,12 @@ constructor( } else { specs.add(tileSpec) } + uiEventLogger.logWithPosition( + if (moved) QSEditEvent.QS_EDIT_MOVE else QSEditEvent.QS_EDIT_ADD, + /* uid= */ 0, + /* packageName= */ tileSpec.metricSpec, + if (moved && position == POSITION_AT_END) specs.size - 1 else position, + ) // Setting the new tiles as one operation to avoid UI jank with tiles disappearing and // reappearing @@ -187,10 +210,80 @@ constructor( /** Immediately removes [tileSpec] from the current tiles. */ fun removeTile(tileSpec: TileSpec) { + uiEventLogger.log( + QSEditEvent.QS_EDIT_REMOVE, + /* uid= */ 0, + /* packageName= */ tileSpec.metricSpec, + ) currentTilesInteractor.removeTiles(listOf(tileSpec)) } fun setTiles(tileSpecs: List<TileSpec>) { + val currentTiles = currentTilesInteractor.currentTilesSpecs currentTilesInteractor.setTiles(tileSpecs) + applicationScope.launch(bgDispatcher) { + calculateDiffsAndEmitUiEvents(currentTiles, tileSpecs) + } + } + + private fun calculateDiffsAndEmitUiEvents( + currentTiles: List<TileSpec>, + newTiles: List<TileSpec>, + ) { + val listDiff = DiffUtil.calculateDiff(DiffCallback(currentTiles, newTiles)) + listDiff.dispatchUpdatesTo( + object : ListUpdateCallback { + override fun onInserted(position: Int, count: Int) { + newTiles.getOrNull(position)?.let { + uiEventLogger.logWithPosition( + QSEditEvent.QS_EDIT_ADD, + /* uid= */ 0, + /* packageName= */ it.metricSpec, + position, + ) + } + } + + override fun onRemoved(position: Int, count: Int) { + currentTiles.getOrNull(position)?.let { + uiEventLogger.log(QSEditEvent.QS_EDIT_REMOVE, 0, it.metricSpec) + } + } + + override fun onMoved(fromPosition: Int, toPosition: Int) { + currentTiles.getOrNull(fromPosition)?.let { + uiEventLogger.logWithPosition( + QSEditEvent.QS_EDIT_MOVE, + /* uid= */ 0, + /* packageName= */ it.metricSpec, + toPosition, + ) + } + } + + override fun onChanged(position: Int, count: Int, payload: Any?) {} + } + ) + } +} + +private class DiffCallback( + private val currentList: List<TileSpec>, + private val newList: List<TileSpec>, +) : DiffUtil.Callback() { + override fun getOldListSize(): Int { + return currentList.size + } + + override fun getNewListSize(): Int { + return newList.size + } + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return currentList[oldItemPosition] == newList[newItemPosition] + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return areItemsTheSame(oldItemPosition, newItemPosition) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt index 2e52845ceb80..16c27223a471 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt @@ -34,10 +34,7 @@ sealed class TileSpec private constructor(open val spec: String) { data object Invalid : TileSpec("") /** Container for the spec of a tile provided by SystemUI. */ - data class PlatformTileSpec - internal constructor( - override val spec: String, - ) : TileSpec(spec) { + data class PlatformTileSpec internal constructor(override val spec: String) : TileSpec(spec) { override fun toString(): String { return "P($spec)" } @@ -49,10 +46,8 @@ sealed class TileSpec private constructor(open val spec: String) { * [componentName] indicates the associated `TileService`. */ data class CustomTileSpec - internal constructor( - override val spec: String, - val componentName: ComponentName, - ) : TileSpec(spec) { + internal constructor(override val spec: String, val componentName: ComponentName) : + TileSpec(spec) { override fun toString(): String { return "C(${componentName.flattenToShortString()})" } @@ -92,3 +87,11 @@ sealed class TileSpec private constructor(open val spec: String) { } } } + +val TileSpec.metricSpec + get() = + when (this) { + is TileSpec.Invalid -> "" + is TileSpec.PlatformTileSpec -> spec + is TileSpec.CustomTileSpec -> componentName.packageName + } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java index deeef550b33f..42a0cb1004f4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java @@ -102,7 +102,7 @@ public class DataSaverTile extends QSTileImpl<BooleanState> implements // Show a dialog to confirm first. Dialogs shown by the DialogTransitionAnimator must be // created and shown on the main thread, so we post it to the UI handler. mUiHandler.post(() -> { - SystemUIDialog dialog = mSystemUIDialogFactory.create(); + SystemUIDialog dialog = mSystemUIDialogFactory.create(mContext); dialog.setTitle(com.android.internal.R.string.data_saver_enable_title); dialog.setMessage(com.android.internal.R.string.data_saver_description); dialog.setPositiveButton(com.android.internal.R.string.data_saver_enable_button, diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java index 4fb96e72d8df..ec8d30b01eab 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java @@ -24,6 +24,7 @@ import android.os.Looper; import android.service.quicksettings.Tile; import android.text.TextUtils; import android.util.Log; +import android.widget.Button; import android.widget.Switch; import androidx.annotation.Nullable; @@ -144,8 +145,10 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> // Show expand icon when clicking will open a dialog state.forceExpandIcon = state.state == Tile.STATE_INACTIVE; + state.expandedAccessibilityClassName = Button.class.getName(); if (isRecording) { state.secondaryLabel = mContext.getString(R.string.quick_settings_screen_record_stop); + state.expandedAccessibilityClassName = Switch.class.getName(); } else if (isStarting) { int countdown = (int) ScreenRecordModel.Starting.Companion.toCountdownSeconds( @@ -157,7 +160,6 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> state.contentDescription = TextUtils.isEmpty(state.secondaryLabel) ? state.label : TextUtils.concat(state.label, ", ", state.secondaryLabel); - state.expandedAccessibilityClassName = Switch.class.getName(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java index 378d553065e0..70c2a2a0d55a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java @@ -104,6 +104,7 @@ public class InternetDialogDelegate implements private final Handler mHandler; private final Executor mBackgroundExecutor; private final DialogTransitionAnimator mDialogTransitionAnimator; + private final Context mContext; private final boolean mAboveStatusBar; private final SystemUIDialog.Factory mSystemUIDialogFactory; @@ -204,6 +205,7 @@ public class InternetDialogDelegate implements @Background Executor executor, KeyguardStateController keyguardStateController, SystemUIDialog.Factory systemUIDialogFactory) { + mContext = context; mAboveStatusBar = aboveStatusBar; mSystemUIDialogFactory = systemUIDialogFactory; if (DEBUG) { @@ -228,7 +230,7 @@ public class InternetDialogDelegate implements @Override public SystemUIDialog createDialog() { - SystemUIDialog dialog = mSystemUIDialogFactory.create(this); + SystemUIDialog dialog = mSystemUIDialogFactory.create(this, mContext); if (!mAboveStatusBar) { dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt index 671943c5baff..d0f258052f04 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt @@ -20,18 +20,19 @@ import android.content.Context import android.content.DialogInterface import android.content.SharedPreferences import android.os.Bundle +import com.android.app.tracing.coroutines.launchTraced as launch import com.android.internal.R import com.android.systemui.coroutines.newTracingContext import com.android.systemui.qs.tiles.impl.saver.domain.interactor.DataSaverTileUserActionInteractor +import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.policy.DataSaverController import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope -import com.android.app.tracing.coroutines.launchTraced as launch class DataSaverDialogDelegate( private val sysuiDialogFactory: SystemUIDialog.Factory, - private val context: Context, + @ShadeDisplayAware private val context: Context, private val backgroundContext: CoroutineContext, private val dataSaverController: DataSaverController, private val sharedPreferences: SharedPreferences, diff --git a/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt b/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt index 95e7f56360c2..8c54ab40c680 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt @@ -25,7 +25,6 @@ import android.provider.Settings import android.view.LayoutInflater import com.android.internal.jank.InteractionJankMonitor import com.android.internal.logging.UiEventLogger -import com.android.systemui.res.R import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.animation.Expandable @@ -34,22 +33,23 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.qs.QSUserSwitcherEvent import com.android.systemui.qs.tiles.UserDetailView +import com.android.systemui.res.R import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.user.ui.dialog.DialogShowerImpl import javax.inject.Inject import javax.inject.Provider -/** - * Controller for [UserDialog]. - */ +/** Controller for [UserDialog]. */ @SysUISingleton -class UserSwitchDialogController @Inject constructor( +class UserSwitchDialogController +@Inject +constructor( private val userDetailViewAdapterProvider: Provider<UserDetailView.Adapter>, private val activityStarter: ActivityStarter, private val falsingManager: FalsingManager, private val dialogTransitionAnimator: DialogTransitionAnimator, private val uiEventLogger: UiEventLogger, - private val dialogFactory: SystemUIDialog.Factory + private val dialogFactory: SystemUIDialog.Factory, ) { companion object { @@ -64,7 +64,7 @@ class UserSwitchDialogController @Inject constructor( * [userDetailViewAdapterProvider] and show it as launched from [expandable]. */ fun showDialog(context: Context, expandable: Expandable) { - with(dialogFactory.create()) { + with(dialogFactory.create(context)) { setShowForAllUsers(true) setCanceledOnTouchOutside(true) @@ -72,24 +72,31 @@ class UserSwitchDialogController @Inject constructor( setPositiveButton(R.string.quick_settings_done) { _, _ -> uiEventLogger.log(QSUserSwitcherEvent.QS_USER_DETAIL_CLOSE) } - setNeutralButton(R.string.quick_settings_more_user_settings, { _, _ -> - if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { - uiEventLogger.log(QSUserSwitcherEvent.QS_USER_MORE_SETTINGS) - val controller = dialogTransitionAnimator.createActivityTransitionController( - getButton(BUTTON_NEUTRAL) - ) + setNeutralButton( + R.string.quick_settings_more_user_settings, + { _, _ -> + if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + uiEventLogger.log(QSUserSwitcherEvent.QS_USER_MORE_SETTINGS) + val controller = + dialogTransitionAnimator.createActivityTransitionController( + getButton(BUTTON_NEUTRAL) + ) - if (controller == null) { - dismiss() - } + if (controller == null) { + dismiss() + } - activityStarter.postStartActivityDismissingKeyguard( - USER_SETTINGS_INTENT, 0, controller - ) - } - }, false /* dismissOnClick */) - val gridFrame = LayoutInflater.from(this.context) - .inflate(R.layout.qs_user_dialog_content, null) + activityStarter.postStartActivityDismissingKeyguard( + USER_SETTINGS_INTENT, + 0, + controller, + ) + } + }, + false, /* dismissOnClick */ + ) + val gridFrame = + LayoutInflater.from(this.context).inflate(R.layout.qs_user_dialog_content, null) setView(gridFrame) val adapter = userDetailViewAdapterProvider.get() @@ -101,10 +108,7 @@ class UserSwitchDialogController @Inject constructor( DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG) ) if (controller != null) { - dialogTransitionAnimator.show( - this, - controller, - ) + dialogTransitionAnimator.show(this, controller) } else { show() } diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt index fc4db0877dbe..b7a3aedc565e 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt @@ -31,6 +31,8 @@ import android.os.UserManager import android.util.Log import androidx.annotation.GuardedBy import androidx.annotation.WorkerThread +import com.android.app.tracing.coroutines.launchTraced as launch +import com.android.app.tracing.traceSection import com.android.systemui.Dumpable import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlagsClassic @@ -49,7 +51,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay -import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.sync.Mutex /** @@ -314,7 +315,9 @@ internal constructor( list.forEach { val callback = it.callback.get() if (callback != null) { - it.executor.execute { action(callback) { latch.countDown() } } + it.executor.execute { + traceSection({ "$callback" }) { action(callback) { latch.countDown() } } + } } else { latch.countDown() } diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java index 30b6892731f1..c241f2165c8f 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java @@ -62,7 +62,7 @@ public class ToggleSeekBar extends SeekBar { } else if (event.getAction() == MotionEvent.ACTION_HOVER_EXIT) { setHovered(false); } - return true; + return super.onHoverEvent(event); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 3a6c250e55f1..d347084f435d 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -3185,7 +3185,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return false; } if (mHeadsUpAppearanceController != null - && mHeadsUpAppearanceController.shouldBeVisible()) { + && mHeadsUpAppearanceController.shouldHeadsUpStatusBarBeVisible()) { return false; } return !mShowIconsWhenExpanded; @@ -4634,7 +4634,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public boolean shouldHeadsUpBeVisible() { return mHeadsUpAppearanceController != null && - mHeadsUpAppearanceController.shouldBeVisible(); + mHeadsUpAppearanceController.shouldHeadsUpStatusBarBeVisible(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java index f5fc1f414f82..bf672be3c8d0 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java @@ -166,6 +166,15 @@ public class NotificationShadeWindowView extends WindowRootView { } @Override + public void onMovedToDisplay(int displayId, Configuration config) { + super.onMovedToDisplay(displayId, config); + ShadeWindowGoesAround.isUnexpectedlyInLegacyMode(); + // When the window is moved we're only receiving a call to this method instead of the + // onConfigurationChange itself. Let's just trigegr a normal config change. + onConfigurationChanged(config); + } + + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (mConfigurationForwarder != null) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt index ff39a3ddc17c..d31868ca0217 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt @@ -22,15 +22,16 @@ import android.view.LayoutInflater import android.view.WindowManager import android.view.WindowManager.LayoutParams import android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE +import android.window.WindowContext import com.android.systemui.CoreStartable import com.android.systemui.common.ui.ConfigurationState import com.android.systemui.common.ui.ConfigurationStateImpl -import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.common.ui.data.repository.ConfigurationRepositoryImpl import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractorImpl import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.res.R import com.android.systemui.scene.ui.view.WindowRootView import com.android.systemui.shade.data.repository.MutableShadeDisplaysRepository @@ -48,6 +49,7 @@ import dagger.Provides import dagger.multibindings.ClassKey import dagger.multibindings.IntoMap import javax.inject.Provider +import javax.inject.Qualifier /** * Module responsible for managing display-specific components and resources for the notification @@ -81,6 +83,19 @@ object ShadeDisplayAwareModule { @Provides @ShadeDisplayAware @SysUISingleton + fun provideShadeDisplayAwareWindowContext(@ShadeDisplayAware context: Context): WindowContext { + ShadeWindowGoesAround.isUnexpectedlyInLegacyMode() + // We rely on the fact context is a WindowContext as the API to reparent windows is only + // available there. + return (context as? WindowContext) + ?: error( + "ShadeDisplayAware context must be a window context to allow window reparenting." + ) + } + + @Provides + @ShadeDisplayAware + @SysUISingleton fun provideShadeWindowLayoutParams(@ShadeDisplayAware context: Context): LayoutParams { return ShadeWindowLayoutParams.create(context) } @@ -119,7 +134,7 @@ object ShadeDisplayAwareModule { fun provideShadeWindowConfigurationController( @ShadeDisplayAware shadeContext: Context, factory: ConfigurationControllerImpl.Factory, - @GlobalConfig globalConfigController: ConfigurationController, + @Main globalConfigController: ConfigurationController, ): ConfigurationController { return if (ShadeWindowGoesAround.isEnabled) { factory.create(shadeContext) @@ -145,7 +160,7 @@ object ShadeDisplayAwareModule { factory: ConfigurationStateImpl.Factory, @ShadeDisplayAware configurationController: ConfigurationController, @ShadeDisplayAware context: Context, - @GlobalConfig configurationState: ConfigurationState, + @Main configurationState: ConfigurationState, ): ConfigurationState { return if (ShadeWindowGoesAround.isEnabled) { factory.create(context, configurationController) @@ -161,7 +176,7 @@ object ShadeDisplayAwareModule { factory: ConfigurationRepositoryImpl.Factory, @ShadeDisplayAware configurationController: ConfigurationController, @ShadeDisplayAware context: Context, - @GlobalConfig globalConfigurationRepository: ConfigurationRepository, + @Main globalConfigurationRepository: ConfigurationRepository, ): ConfigurationRepository { return if (ShadeWindowGoesAround.isEnabled) { factory.create(context, configurationController) @@ -175,7 +190,7 @@ object ShadeDisplayAwareModule { @ShadeDisplayAware fun provideShadeAwareConfigurationInteractor( @ShadeDisplayAware configurationRepository: ConfigurationRepository, - @GlobalConfig configurationInteractor: ConfigurationInteractor, + @Main configurationInteractor: ConfigurationInteractor, ): ConfigurationInteractor { return if (ShadeWindowGoesAround.isEnabled) { ConfigurationInteractorImpl(configurationRepository) @@ -203,7 +218,9 @@ object ShadeDisplayAwareModule { @Provides @IntoMap @ClassKey(ShadePrimaryDisplayCommand::class) - fun provideShadePrimaryDisplayCommand(impl: Provider<ShadePrimaryDisplayCommand>): CoreStartable { + fun provideShadePrimaryDisplayCommand( + impl: Provider<ShadePrimaryDisplayCommand> + ): CoreStartable { return if (ShadeWindowGoesAround.isEnabled) { impl.get() } else { @@ -221,9 +238,23 @@ object ShadeDisplayAwareModule { CoreStartable.NOP } } + + @Provides + @ShadeOnDefaultDisplayWhenLocked + fun provideShadeOnDefaultDisplayWhenLocked(): Boolean = true } @Module internal interface OptionalShadeDisplayAwareBindings { @BindsOptionalOf fun bindOptionalOfWindowRootView(): WindowRootView } + +/** + * Annotates the boolean value that defines whether the shade window should go back to the default + * display when the keyguard is visible. + * + * As of today (Dec 2024), This is a configuration parameter provided in the dagger graph as the + * final policy around keyguard display is still under discussion, and will be evaluated based on + * how well this solution behaves from the performance point of view. + */ +@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ShadeOnDefaultDisplayWhenLocked diff --git a/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt b/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt index ae36e81c7b1f..29c7aa0680d3 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt @@ -21,13 +21,18 @@ import android.view.GestureDetector import android.view.GestureDetector.SimpleOnGestureListener import android.view.MotionEvent import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import javax.inject.Inject /** Accepts touch events, detects long press, and calls ShadeViewController#onStatusBarLongPress. */ @SysUISingleton class StatusBarLongPressGestureDetector @Inject -constructor(context: Context, val shadeViewController: ShadeViewController) { +constructor( + // TODO b/383125226 - Make this class per-display + @Main context: Context, + val shadeViewController: ShadeViewController, +) { val gestureDetector = GestureDetector( context, diff --git a/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt b/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt index 22e9487af84c..30b086f03d66 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt @@ -22,34 +22,55 @@ import com.android.app.tracing.coroutines.launchTraced import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.display.data.repository.DisplayRepository +import com.android.systemui.keyguard.data.repository.KeyguardRepository +import com.android.systemui.shade.ShadeOnDefaultDisplayWhenLocked import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn /** * Moves the shade on the last display that received a status bar touch. * - * If the display is removed, falls back to the default one. + * If the display is removed, falls back to the default one. When [shadeOnDefaultDisplayWhenLocked] + * is true, the shade falls back to the default display when the keyguard is visible. */ @SysUISingleton class StatusBarTouchShadeDisplayPolicy @Inject -constructor(displayRepository: DisplayRepository, @Background val backgroundScope: CoroutineScope) : - ShadeDisplayPolicy { - override val name: String - get() = "status_bar_latest_touch" +constructor( + displayRepository: DisplayRepository, + keyguardRepository: KeyguardRepository, + @Background val backgroundScope: CoroutineScope, + @ShadeOnDefaultDisplayWhenLocked val shadeOnDefaultDisplayWhenLocked: Boolean, +) : ShadeDisplayPolicy { + override val name: String = "status_bar_latest_touch" private val currentDisplayId = MutableStateFlow(Display.DEFAULT_DISPLAY) private val availableDisplayIds: StateFlow<Set<Int>> = displayRepository.displayIds - override val displayId: StateFlow<Int> - get() = currentDisplayId + override val displayId: StateFlow<Int> = + if (shadeOnDefaultDisplayWhenLocked) { + keyguardRepository.isKeyguardShowing + .combine(currentDisplayId) { isKeyguardShowing, currentDisplayId -> + if (isKeyguardShowing) { + Display.DEFAULT_DISPLAY + } else { + currentDisplayId + } + } + .stateIn(backgroundScope, SharingStarted.WhileSubscribed(), currentDisplayId.value) + } else { + currentDisplayId + } private var removalListener: Job? = null diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt index 34148671cf2a..08c03e28d596 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt @@ -16,10 +16,8 @@ package com.android.systemui.shade.domain.interactor -import android.content.Context import android.util.Log -import android.view.WindowManager -import android.view.WindowManager.LayoutParams +import android.window.WindowContext import androidx.annotation.UiThread import com.android.app.tracing.coroutines.launchTraced import com.android.app.tracing.traceSection @@ -45,9 +43,7 @@ class ShadeDisplaysInteractor constructor( optionalShadeRootView: Optional<WindowRootView>, private val shadePositionRepository: ShadeDisplaysRepository, - @ShadeDisplayAware private val shadeContext: Context, - @ShadeDisplayAware private val shadeLayoutParams: LayoutParams, - @ShadeDisplayAware private val wm: WindowManager, + @ShadeDisplayAware private val shadeContext: WindowContext, @Background private val bgScope: CoroutineScope, @Main private val mainThreadContext: CoroutineContext, ) : CoreStartable { @@ -72,7 +68,11 @@ constructor( /** Tries to move the shade. If anything wrong happens, fails gracefully without crashing. */ private suspend fun moveShadeWindowTo(destinationId: Int) { Log.d(TAG, "Trying to move shade window to display with id $destinationId") - val currentDisplay = shadeRootView.display + // Why using the shade context here instead of the view's Display? + // The context's display is updated before the view one, so it is a better indicator of + // which display the shade is supposed to be at. The View display is updated after the first + // rendering with the new config. + val currentDisplay = shadeContext.display if (currentDisplay == null) { Log.w(TAG, "Current shade display is null") return @@ -83,7 +83,7 @@ constructor( return } try { - withContext(mainThreadContext) { moveShadeWindow(toId = destinationId) } + withContext(mainThreadContext) { reparentToDisplayId(id = destinationId) } } catch (e: IllegalStateException) { Log.e( TAG, @@ -94,25 +94,8 @@ constructor( } @UiThread - private fun moveShadeWindow(toId: Int) { - traceSection({ "moveShadeWindow to $toId" }) { - removeShadeWindow() - updateContextDisplay(toId) - addShadeWindow() - } - } - - @UiThread - private fun removeShadeWindow(): Unit = - traceSection("removeShadeWindow") { wm.removeView(shadeRootView) } - - @UiThread - private fun addShadeWindow(): Unit = - traceSection("addShadeWindow") { wm.addView(shadeRootView, shadeLayoutParams) } - - @UiThread - private fun updateContextDisplay(newDisplayId: Int) { - traceSection("updateContextDisplay") { shadeContext.updateDisplay(newDisplayId) } + private fun reparentToDisplayId(id: Int) { + traceSection({ "reparentToDisplayId(id=$id)" }) { shadeContext.reparentToDisplay(id) } } private companion object { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java index 6fd2d3fafb88..2544323d83d5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java @@ -20,7 +20,6 @@ import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; import static com.android.systemui.Flags.fetchBookmarksXmlKeyboardShortcuts; -import static com.android.systemui.Flags.validateKeyboardShortcutHelperIconUri; import android.annotation.NonNull; import android.annotation.Nullable; @@ -78,7 +77,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.AssistUtils; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; -import com.android.settingslib.Utils; import com.android.systemui.res.R; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -428,9 +426,7 @@ public final class KeyboardShortcutListSearch { mKeySearchResultMap.put(SHORTCUT_SPECIFICAPP_INDEX, false); } else { mCurrentAppPackageName = result.get(0).getPackageName(); - if (validateKeyboardShortcutHelperIconUri()) { - KeyboardShortcuts.sanitiseShortcuts(result); - } + KeyboardShortcuts.sanitiseShortcuts(result); mSpecificAppGroup.addAll( reMapToKeyboardShortcutMultiMappingGroup(result)); mKeySearchResultMap.put(SHORTCUT_SPECIFICAPP_INDEX, true); @@ -446,9 +442,7 @@ public final class KeyboardShortcutListSearch { // Add specific Ime shortcuts if (result != null) { if (!result.isEmpty()) { - if (validateKeyboardShortcutHelperIconUri()) { - KeyboardShortcuts.sanitiseShortcuts(result); - } + KeyboardShortcuts.sanitiseShortcuts(result); mInputGroup.addAll( reMapToKeyboardShortcutMultiMappingGroup(result)); } @@ -1416,13 +1410,11 @@ public final class KeyboardShortcutListSearch { } private int getColorOfTextColorOnAccent() { - return Utils.getColorAttrDefaultColor( - mContext, com.android.internal.R.attr.materialColorOnPrimary); + return mContext.getColor(com.android.internal.R.color.materialColorOnPrimary); } private int getColorOfTextColorSecondary() { - return Utils.getColorAttrDefaultColor( - mContext, com.android.internal.R.attr.materialColorOnSurface); + return mContext.getColor(com.android.internal.R.color.materialColorOnSurface); } // Create the new data structure for handling the N-to-1 key mapping and other complex case. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java index 766c391b14d8..2ed168aa82e8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java @@ -21,7 +21,6 @@ import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; import static com.android.systemui.Flags.fetchBookmarksXmlKeyboardShortcuts; -import static com.android.systemui.Flags.validateKeyboardShortcutHelperIconUri; import android.annotation.NonNull; import android.annotation.Nullable; @@ -412,10 +411,7 @@ public final class KeyboardShortcuts { mReceivedAppShortcutGroups = result == null ? Collections.emptyList() : result; - if (validateKeyboardShortcutHelperIconUri()) { - sanitiseShortcuts(mReceivedAppShortcutGroups); - } - + sanitiseShortcuts(mReceivedAppShortcutGroups); maybeMergeAndShowKeyboardShortcuts(); } @@ -423,10 +419,7 @@ public final class KeyboardShortcuts { mReceivedImeShortcutGroups = result == null ? Collections.emptyList() : result; - if (validateKeyboardShortcutHelperIconUri()) { - sanitiseShortcuts(mReceivedImeShortcutGroups); - } - + sanitiseShortcuts(mReceivedImeShortcutGroups); maybeMergeAndShowKeyboardShortcuts(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt index 571a3e44d233..bbecde830a9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt @@ -57,6 +57,14 @@ constructor( // top-level tag. It should instead be provided as the first string in each log message. private val extraLogTag = "SingleChipInteractor[key=$key]" + init { + if (startingModel.promotedContent == null) { + logger.e({ "$str1: Starting model has promotedContent=null, which shouldn't happen" }) { + str1 = extraLogTag + } + } + } + private val _notificationModel = MutableStateFlow(startingModel) /** @@ -71,6 +79,14 @@ constructor( } return } + if (model.promotedContent == null) { + logger.e({ + "$str1: received model with promotedContent=null, which shouldn't happen" + }) { + str1 = extraLogTag + } + return + } _notificationModel.value = model } @@ -99,6 +115,15 @@ constructor( } private fun ActiveNotificationModel.toNotificationChipModel(): NotificationChipModel? { + val promotedContent = this.promotedContent + if (promotedContent == null) { + logger.w({ + "$str1: Can't show chip because promotedContent=null, which shouldn't happen" + }) { + str1 = extraLogTag + } + return null + } val statusBarChipIconView = this.statusBarChipIconView if (statusBarChipIconView == null) { if (!StatusBarConnectedDisplays.isEnabled) { @@ -111,7 +136,8 @@ constructor( return null } } - return NotificationChipModel(key, statusBarChipIconView, whenTime) + + return NotificationChipModel(key, statusBarChipIconView, whenTime, promotedContent) } @AssistedFactory diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt index 4588b19bd720..9f0638baec83 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt @@ -17,10 +17,13 @@ package com.android.systemui.statusbar.chips.notification.domain.model import com.android.systemui.statusbar.StatusBarIconView +import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel /** Modeling all the data needed to render a status bar notification chip. */ data class NotificationChipModel( val key: String, val statusBarChipIconView: StatusBarIconView?, + // TODO(b/364653005): Use [PromotedNotificationContentModel.time] instead of a custom field. val whenTime: Long, + val promotedContent: PromotedNotificationContentModel, ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt index 2cd5bb339072..2d16f3b51ed1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt @@ -25,10 +25,12 @@ import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifCh import com.android.systemui.statusbar.chips.ui.model.ColorsModel import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.statusbar.core.StatusBarConnectedDisplays +import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor +import com.android.systemui.statusbar.notification.headsup.PinnedStatus import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch /** A view model for status bar chips for promoted ongoing notifications. */ @@ -38,18 +40,24 @@ class NotifChipsViewModel constructor( @Application private val applicationScope: CoroutineScope, private val notifChipsInteractor: StatusBarNotificationChipsInteractor, + headsUpNotificationInteractor: HeadsUpNotificationInteractor, ) { /** * A flow modeling the notification chips that should be shown. Emits an empty list if there are * no notifications that should show a status bar chip. */ val chips: Flow<List<OngoingActivityChipModel.Shown>> = - notifChipsInteractor.notificationChips.map { notifications -> - notifications.map { it.toActivityChipModel() } + combine( + notifChipsInteractor.notificationChips, + headsUpNotificationInteractor.statusBarHeadsUpState, + ) { notifications, headsUpState -> + notifications.map { it.toActivityChipModel(headsUpState) } } /** Converts the notification to the [OngoingActivityChipModel] object. */ - private fun NotificationChipModel.toActivityChipModel(): OngoingActivityChipModel.Shown { + private fun NotificationChipModel.toActivityChipModel( + headsUpState: PinnedStatus + ): OngoingActivityChipModel.Shown { StatusBarNotifChips.assertInNewMode() val icon = if (this.statusBarChipIconView != null) { @@ -59,8 +67,11 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon(this.key) } - // TODO(b/364653005): Use the notification color if applicable. - val colors = ColorsModel.Themed + val colors = + ColorsModel.Custom( + backgroundColorInt = this.promotedContent.colors.backgroundColor, + primaryTextColorInt = this.promotedContent.colors.primaryTextColor, + ) val onClickListener = View.OnClickListener { // The notification pipeline needs everything to run on the main thread, so keep @@ -71,12 +82,18 @@ constructor( ) } } - return OngoingActivityChipModel.Shown.ShortTimeDelta( - icon, - colors, - time = this.whenTime, - onClickListener, - ) + return if (headsUpState == PinnedStatus.PinnedByUser) { + // If the user tapped the chip to show the HUN, we want to just show the icon because + // the HUN will show the rest of the information. + OngoingActivityChipModel.Shown.IconOnly(icon, colors, onClickListener) + } else { + OngoingActivityChipModel.Shown.ShortTimeDelta( + icon, + colors, + time = this.whenTime, + onClickListener, + ) + } // TODO(b/364653005): Use Notification.showWhen to determine if we should show the time. // TODO(b/364653005): If Notification.shortCriticalText is set, use that instead of `when`. // TODO(b/364653005): If the app that posted the notification is in the foreground, don't diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt index 4b0fc5ab6059..efedf41e4684 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt @@ -40,21 +40,25 @@ sealed interface ColorsModel { } /** - * The chip should have the given background color, and text color that matches dark/light - * theme. + * The chip should have the given background color and primary text color. + * + * If [primaryTextColorInt] is null, the text color will match the current UI mode (light/dark). */ - data class Custom(val backgroundColorInt: Int) : ColorsModel { + data class Custom(val backgroundColorInt: Int, val primaryTextColorInt: Int? = null) : + ColorsModel { override fun background(context: Context): ColorStateList = ColorStateList.valueOf(backgroundColorInt) - // TODO(b/361346412): When dark theme changes, the chip should automatically re-render with + // TODO(b/361346412): When UI mode changes, the chip should automatically re-render with // the right text color. Right now, it has the right text color when the chip is first - // created but the color doesn't update if dark theme changes. - override fun text(context: Context) = - Utils.getColorAttrDefaultColor( - context, - com.android.internal.R.attr.materialColorOnSurface, - ) + // created but the color doesn't update if UI mode changes. + override fun text(context: Context): Int { + return primaryTextColorInt + ?: Utils.getColorAttrDefaultColor( + context, + com.android.internal.R.color.materialColorOnSurface, + ) + } } /** The chip should have a red background with white text. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt index 280d66bcb827..6cf2c73a7138 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt @@ -18,9 +18,9 @@ package com.android.systemui.statusbar.data.repository import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR import com.android.systemui.CoreStartable -import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.display.data.repository.DisplayRepository import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository import com.android.systemui.display.data.repository.PerDisplayStore @@ -74,7 +74,7 @@ constructor( @SysUISingleton class SingleDisplayStatusBarConfigurationControllerStore @Inject -constructor(@GlobalConfig globalConfigurationController: ConfigurationController) : +constructor(@Main globalConfigurationController: ConfigurationController) : StatusBarConfigurationControllerStore, PerDisplayStore<StatusBarConfigurationController> by SingleDisplayStore( globalConfigurationController as StatusBarConfigurationController diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt index cc91e2dc3a25..22c37df7db7e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt @@ -37,6 +37,7 @@ import com.android.systemui.statusbar.phone.BoundsPair import com.android.systemui.statusbar.phone.LetterboxAppearanceCalculator import com.android.systemui.statusbar.phone.StatusBarBoundsProvider import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent +import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel import dagger.assisted.Assisted @@ -89,6 +90,9 @@ interface StatusBarModePerDisplayRepository : OnStatusBarViewInitializedListener /** The current mode of the status bar. */ val statusBarMode: StateFlow<StatusBarMode> + /** Whether the status bar is forced to be visible because of an ongoing call */ + val ongoingProcessRequiresStatusBarVisible: StateFlow<Boolean> + /** * Requests for the status bar to be shown transiently. * @@ -110,6 +114,12 @@ interface StatusBarModePerDisplayRepository : OnStatusBarViewInitializedListener * if needed. */ fun stop() + + /** + * Called when an ongoing process needs to prevent the status bar from being hidden in any + * state. + */ + fun setOngoingProcessRequiresStatusBarVisible(requiredVisible: Boolean) } class StatusBarModePerDisplayRepositoryImpl @@ -195,6 +205,16 @@ constructor( statusBarBoundsProvider.addChangeListener(listener) } + private val _ongoingProcessRequiresStatusBarVisible = MutableStateFlow(false) + override val ongoingProcessRequiresStatusBarVisible = + _ongoingProcessRequiresStatusBarVisible.asStateFlow() + + override fun setOngoingProcessRequiresStatusBarVisible( + requiredVisible: Boolean + ) { + _ongoingProcessRequiresStatusBarVisible.value = requiredVisible + } + override val isInFullscreenMode: StateFlow<Boolean> = _originalStatusBarAttributes .map { params -> @@ -235,16 +255,28 @@ constructor( isTransientShown, isInFullscreenMode, ongoingCallRepository.ongoingCallState, - ) { modifiedAttributes, isTransientShown, isInFullscreenMode, ongoingCallState -> + _ongoingProcessRequiresStatusBarVisible, + ) { + modifiedAttributes, + isTransientShown, + isInFullscreenMode, + ongoingCallStateLegacy, + ongoingProcessRequiresStatusBarVisible -> if (modifiedAttributes == null) { null } else { + val hasOngoingCall = + if (StatusBarChipsModernization.isEnabled) { + ongoingProcessRequiresStatusBarVisible + } else { + ongoingCallStateLegacy is OngoingCallModel.InCall + } val statusBarMode = toBarMode( modifiedAttributes.appearance, isTransientShown, isInFullscreenMode, - hasOngoingCall = ongoingCallState is OngoingCallModel.InCall, + hasOngoingCall, ) StatusBarAppearance( statusBarMode, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 6b84b6d07702..c38b84b710bc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -666,7 +666,16 @@ public final class NotificationEntry extends ListEntry { } public boolean isRowPinned() { - return row != null && row.isPinned(); + return getPinnedStatus().isPinned(); + } + + /** Returns this notification's current pinned status. */ + public PinnedStatus getPinnedStatus() { + if (row != null) { + return row.getPinnedStatus(); + } else { + return PinnedStatus.NotPinned; + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt index 0269b16d4490..eb6ec9f59a3e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt @@ -43,6 +43,7 @@ import com.android.systemui.statusbar.notification.collection.render.NodeControl import com.android.systemui.statusbar.notification.dagger.IncomingHeader import com.android.systemui.statusbar.notification.headsup.HeadsUpManager import com.android.systemui.statusbar.notification.headsup.OnHeadsUpChangedListener +import com.android.systemui.statusbar.notification.headsup.PinnedStatus import com.android.systemui.statusbar.notification.interruption.HeadsUpViewBinder import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider import com.android.systemui.statusbar.notification.logKey @@ -145,6 +146,7 @@ constructor( // heads-up is considered to be the top notification. shouldHeadsUpEver = true, shouldHeadsUpAgain = true, + isPinnedByUser = true, isHeadsUpEntry = mHeadsUpManager.isHeadsUpEntry(entry.key), isBinding = isEntryBinding(entry), ) @@ -155,8 +157,8 @@ constructor( } } - private fun onHeadsUpViewBound(entry: NotificationEntry) { - mHeadsUpManager.showNotification(entry) + private fun onHeadsUpViewBound(entry: NotificationEntry, isPinnedByUser: Boolean) { + mHeadsUpManager.showNotification(entry, isPinnedByUser) mEntriesBindingUntil.remove(entry.key) } @@ -424,6 +426,7 @@ constructor( private fun handlePostedEntry(posted: PostedEntry, hunMutator: HunMutator, scenario: String) { mLogger.logPostedEntryWillEvaluate(posted, scenario) + if (posted.wasAdded) { if (posted.shouldHeadsUpEver) { bindForAsyncHeadsUp(posted) @@ -437,7 +440,17 @@ constructor( // If showing heads up, we need to post an update. Otherwise we're still // binding, and we can just let that finish. if (posted.isHeadsUpEntry) { - hunMutator.updateNotification(posted.key, posted.shouldHeadsUpAgain) + val pinnedStatus = + if (posted.shouldHeadsUpAgain) { + if (StatusBarNotifChips.isEnabled && posted.isPinnedByUser) { + PinnedStatus.PinnedByUser + } else { + PinnedStatus.PinnedBySystem + } + } else { + PinnedStatus.NotPinned + } + hunMutator.updateNotification(posted.key, pinnedStatus) } } else { if (posted.isHeadsUpEntry) { @@ -461,10 +474,11 @@ constructor( } private fun bindForAsyncHeadsUp(posted: PostedEntry) { + val isPinnedByUser = StatusBarNotifChips.isEnabled && posted.isPinnedByUser // TODO: Add a guarantee to bindHeadsUpView of some kind of callback if the bind is // cancelled so that we don't need to have this sad timeout hack. mEntriesBindingUntil[posted.key] = mNow + BIND_TIMEOUT - mHeadsUpViewBinder.bindHeadsUpView(posted.entry, this::onHeadsUpViewBound) + mHeadsUpViewBinder.bindHeadsUpView(posted.entry, isPinnedByUser, this::onHeadsUpViewBound) } private val mNotifCollectionListener = @@ -906,6 +920,7 @@ constructor( var wasUpdated: Boolean, var shouldHeadsUpEver: Boolean, var shouldHeadsUpAgain: Boolean, + var isPinnedByUser: Boolean = false, var isHeadsUpEntry: Boolean, var isBinding: Boolean, ) { @@ -943,7 +958,7 @@ private fun <R> HeadsUpManager.modifyHuns(block: (HunMutator) -> R): R { /** Mutates the HeadsUp state of notifications. */ private interface HunMutator { - fun updateNotification(key: String, shouldHeadsUpAgain: Boolean) + fun updateNotification(key: String, requestedPinnedStatus: PinnedStatus) fun removeNotification(key: String, releaseImmediately: Boolean) } @@ -955,8 +970,8 @@ private interface HunMutator { private class HunMutatorImpl(private val headsUpManager: HeadsUpManager) : HunMutator { private val deferred = mutableListOf<Pair<String, Boolean>>() - override fun updateNotification(key: String, shouldHeadsUpAgain: Boolean) { - headsUpManager.updateNotification(key, shouldHeadsUpAgain) + override fun updateNotification(key: String, requestedPinnedStatus: PinnedStatus) { + headsUpManager.updateNotification(key, requestedPinnedStatus) } override fun removeNotification(key: String, releaseImmediately: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt index 64e78e4fbe48..75c7d2d5be98 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt @@ -25,6 +25,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.data.repository.HeadsUpRepository import com.android.systemui.statusbar.notification.data.repository.HeadsUpRowRepository +import com.android.systemui.statusbar.notification.headsup.PinnedStatus import com.android.systemui.statusbar.notification.shared.HeadsUpRowKey import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -97,19 +98,22 @@ constructor( } } - /** Are there any pinned heads up rows to display? */ - val hasPinnedRows: Flow<Boolean> = + /** What [PinnedStatus] does the top row have? */ + private val topPinnedStatus: Flow<PinnedStatus> = headsUpRepository.activeHeadsUpRows.flatMapLatest { rows -> if (rows.isNotEmpty()) { combine(rows.map { it.pinnedStatus }) { pinnedStatus -> - pinnedStatus.any { it.isPinned } + pinnedStatus.firstOrNull { it.isPinned } ?: PinnedStatus.NotPinned } } else { // if the set is empty, there are no flows to combine - flowOf(false) + flowOf(PinnedStatus.NotPinned) } } + /** Are there any pinned heads up rows to display? */ + val hasPinnedRows: Flow<Boolean> = topPinnedStatus.map { it.isPinned } + val isHeadsUpOrAnimatingAway: Flow<Boolean> by lazy { if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) { flowOf(false) @@ -138,9 +142,14 @@ constructor( } } - val showHeadsUpStatusBar = - combine(hasPinnedRows, canShowHeadsUp) { hasPinnedRows, canShowHeadsUp -> - hasPinnedRows && canShowHeadsUp + /** Emits the pinned notification state as it relates to the status bar. */ + val statusBarHeadsUpState: Flow<PinnedStatus> = + combine(topPinnedStatus, canShowHeadsUp) { topPinnedStatus, canShowHeadsUp -> + if (canShowHeadsUp) { + topPinnedStatus + } else { + PinnedStatus.NotPinned + } } fun headsUpRow(key: HeadsUpRowKey): HeadsUpRowInteractor = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java index a0515ca92cdd..d25889820629 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java @@ -39,7 +39,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; -import com.android.settingslib.Utils; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.ColorUpdateLogger; import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor; @@ -457,8 +456,8 @@ public class FooterView extends StackScrollerDecorView { */ public void updateColors() { Resources.Theme theme = mContext.getTheme(); - final @ColorInt int onSurface = Utils.getColorAttrDefaultColor(mContext, - com.android.internal.R.attr.materialColorOnSurface); + final @ColorInt int onSurface = mContext.getColor( + com.android.internal.R.color.materialColorOnSurface); // Same resource, separate drawables to prevent touch effects from showing on the wrong // button. final Drawable clearAllBg = theme.getDrawable(R.drawable.notif_footer_btn_background); @@ -467,8 +466,8 @@ public class FooterView extends StackScrollerDecorView { ? theme.getDrawable(R.drawable.notif_footer_btn_background) : null; final @ColorInt int scHigh; if (!notificationFooterBackgroundTintOptimization()) { - scHigh = Utils.getColorAttrDefaultColor(mContext, - com.android.internal.R.attr.materialColorSurfaceContainerHigh); + scHigh = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceContainerHigh); if (scHigh != 0) { final ColorFilter bgColorFilter = new PorterDuffColorFilter(scHigh, SRC_ATOP); clearAllBg.setColorFilter(bgColorFilter); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManager.kt index 424a3c5e6af9..95234dacc899 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManager.kt @@ -88,6 +88,12 @@ interface HeadsUpManager : Dumpable { /** Returns whether there are any pinned Heads Up Notifications or not. */ fun hasPinnedHeadsUp(): Boolean + /** + * Returns the status of the top Heads Up Notification, or returns [PinnedStatus.NotPinned] if + * there is no pinned HUN. + */ + fun pinnedHeadsUpStatus(): PinnedStatus + /** Returns whether or not the given notification is managed by this manager. */ fun isHeadsUpEntry(key: String): Boolean @@ -204,8 +210,10 @@ interface HeadsUpManager : Dumpable { * the notification to be managed. * * @param entry entry to show + * @param isPinnedByUser true if the notification was pinned by the user and false if the + * notification was pinned by the system. */ - fun showNotification(entry: NotificationEntry) + fun showNotification(entry: NotificationEntry, isPinnedByUser: Boolean = false) fun snooze() @@ -216,7 +224,15 @@ interface HeadsUpManager : Dumpable { */ fun unpinAll(userUnPinned: Boolean) - fun updateNotification(key: String, shouldHeadsUpAgain: Boolean) + /** + * Called when the notification state has been updated. + * + * @param key the key of the entry that was updated + * @param requestedPinnedStatus whether and how the notification should be pinned. If equal to + * [PinnedStatus.NotPinned], the notification won't show again. Otherwise, the notification + * should show again and will force reevaluation of removal time. + */ + fun updateNotification(key: String, requestedPinnedStatus: PinnedStatus) fun onEntryAnimatingAwayEnded(entry: NotificationEntry) } @@ -262,6 +278,8 @@ class HeadsUpManagerEmptyImpl @Inject constructor() : HeadsUpManager { override fun hasPinnedHeadsUp() = false + override fun pinnedHeadsUpStatus() = PinnedStatus.NotPinned + override fun isHeadsUpEntry(key: String) = false override fun isHeadsUpAnimatingAwayValue() = false @@ -306,13 +324,13 @@ class HeadsUpManagerEmptyImpl @Inject constructor() : HeadsUpManager { override fun shouldSwallowClick(key: String): Boolean = false - override fun showNotification(entry: NotificationEntry) {} + override fun showNotification(entry: NotificationEntry, isPinnedByUser: Boolean) {} override fun snooze() {} override fun unpinAll(userUnPinned: Boolean) {} - override fun updateNotification(key: String, alert: Boolean) {} + override fun updateNotification(key: String, requestedPinnedStatus: PinnedStatus) {} override fun onEntryAnimatingAwayEnded(entry: NotificationEntry) {} } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java index 0b188afa1c35..6aa8d0ab3d1c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java @@ -45,6 +45,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag; import com.android.systemui.shade.ShadeDisplayAware; import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener; import com.android.systemui.statusbar.notification.collection.provider.OnReorderingBannedListener; @@ -99,6 +100,7 @@ public class HeadsUpManagerImpl protected int mTouchAcceptanceDelay; protected int mSnoozeLengthMs; protected boolean mHasPinnedNotification; + private PinnedStatus mPinnedNotificationStatus = PinnedStatus.NotPinned; protected int mUser; private final ArrayMap<String, Long> mSnoozedPackages; @@ -183,7 +185,7 @@ public class HeadsUpManagerImpl @Inject public HeadsUpManagerImpl( - @NonNull final Context context, + @NonNull @ShadeDisplayAware final Context context, HeadsUpManagerLogger logger, StatusBarStateController statusBarStateController, KeyguardBypassController bypassController, @@ -303,28 +305,28 @@ public class HeadsUpManagerImpl + resources.getDimensionPixelSize(R.dimen.heads_up_status_bar_padding); } - /** - * Called when posting a new notification that should appear on screen. - * Adds the notification to be managed. - * @param entry entry to show - */ @Override - public void showNotification(@NonNull NotificationEntry entry) { + public void showNotification( + @NonNull NotificationEntry entry, boolean isPinnedByUser) { HeadsUpEntry headsUpEntry = createHeadsUpEntry(entry); - mLogger.logShowNotificationRequest(entry); + mLogger.logShowNotificationRequest(entry, isPinnedByUser); Runnable runnable = () -> { - mLogger.logShowNotification(entry); + mLogger.logShowNotification(entry, isPinnedByUser); // Add new entry and begin managing it mHeadsUpEntryMap.put(entry.getKey(), headsUpEntry); - onEntryAdded(headsUpEntry); + PinnedStatus requestedPinnedStatus = + isPinnedByUser + ? PinnedStatus.PinnedByUser + : PinnedStatus.PinnedBySystem; + onEntryAdded(headsUpEntry, requestedPinnedStatus); // TODO(b/328390331) move accessibility events to the view layer entry.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); entry.setIsHeadsUpEntry(true); - updateNotificationInternal(entry.getKey(), true /* shouldHeadsUpAgain */); + updateNotificationInternal(entry.getKey(), requestedPinnedStatus); entry.setInterruption(); }; mAvalancheController.update(headsUpEntry, runnable, "showNotification"); @@ -375,25 +377,22 @@ public class HeadsUpManagerImpl return false; } - /** - * Called when the notification state has been updated. - * @param key the key of the entry that was updated - * @param shouldHeadsUpAgain whether the notification should show again and force reevaluation - * of removal time - */ - public void updateNotification(@NonNull String key, boolean shouldHeadsUpAgain) { + @Override + public void updateNotification( + @NonNull String key, @NonNull PinnedStatus requestedPinnedStatus) { HeadsUpEntry headsUpEntry = mHeadsUpEntryMap.get(key); - mLogger.logUpdateNotificationRequest(key, shouldHeadsUpAgain, headsUpEntry != null); + mLogger.logUpdateNotificationRequest(key, requestedPinnedStatus, headsUpEntry != null); Runnable runnable = () -> { - updateNotificationInternal(key, shouldHeadsUpAgain); + updateNotificationInternal(key, requestedPinnedStatus); }; mAvalancheController.update(headsUpEntry, runnable, "updateNotification"); } - private void updateNotificationInternal(@NonNull String key, boolean shouldHeadsUpAgain) { + private void updateNotificationInternal( + @NonNull String key, PinnedStatus requestedPinnedStatus) { HeadsUpEntry headsUpEntry = mHeadsUpEntryMap.get(key); - mLogger.logUpdateNotification(key, shouldHeadsUpAgain, headsUpEntry != null); + mLogger.logUpdateNotification(key, requestedPinnedStatus, headsUpEntry != null); if (headsUpEntry == null) { // the entry was released before this update (i.e by a listener) This can happen // with the groupmanager @@ -404,11 +403,10 @@ public class HeadsUpManagerImpl headsUpEntry.mEntry.sendAccessibilityEvent( AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); } - if (shouldHeadsUpAgain) { + if (requestedPinnedStatus.isPinned()) { headsUpEntry.updateEntry(true /* updatePostTime */, "updateNotification"); - PinnedStatus pinnedStatus = shouldHeadsUpBecomePinned(headsUpEntry.mEntry) - ? PinnedStatus.PinnedBySystem - : PinnedStatus.NotPinned; + PinnedStatus pinnedStatus = + getNewPinnedStatusForEntry(headsUpEntry, requestedPinnedStatus); if (headsUpEntry != null) { setEntryPinned(headsUpEntry, pinnedStatus, "updateNotificationInternal"); } @@ -596,22 +594,43 @@ public class HeadsUpManagerImpl * Manager-specific logic that should occur when an entry is added. * @param headsUpEntry entry added */ - protected void onEntryAdded(HeadsUpEntry headsUpEntry) { + @VisibleForTesting + void onEntryAdded(HeadsUpEntry headsUpEntry, PinnedStatus requestedPinnedStatus) { NotificationEntry entry = headsUpEntry.mEntry; entry.setHeadsUp(true); - final PinnedStatus pinnedStatus = shouldHeadsUpBecomePinned(entry) - ? PinnedStatus.PinnedBySystem - : PinnedStatus.NotPinned; + PinnedStatus pinnedStatus = getNewPinnedStatusForEntry(headsUpEntry, requestedPinnedStatus); setEntryPinned(headsUpEntry, pinnedStatus, "onEntryAdded"); EventLogTags.writeSysuiHeadsUpStatus(entry.getKey(), 1 /* visible */); for (OnHeadsUpChangedListener listener : mListeners) { + // TODO(b/382509804): It's odd that if pinnedStatus == PinnedStatus.NotPinned, then we + // still send isHeadsUp=true to listeners. Is this causing bugs? listener.onHeadsUpStateChanged(entry, true); } updateTopHeadsUpFlow(); updateHeadsUpFlow(); } + private PinnedStatus getNewPinnedStatusForEntry( + HeadsUpEntry headsUpEntry, PinnedStatus requestedPinnedStatus) { + NotificationEntry entry = headsUpEntry.mEntry; + if (entry == null) { + return PinnedStatus.NotPinned; + } + boolean shouldBecomePinned = shouldHeadsUpBecomePinned(entry); + if (!shouldBecomePinned) { + return PinnedStatus.NotPinned; + } + + if (!StatusBarNotifChips.isEnabled() + && requestedPinnedStatus == PinnedStatus.PinnedByUser) { + Log.wtf(TAG, "PinnedStatus.PinnedByUser not allowed if StatusBarNotifChips flag off"); + return PinnedStatus.NotPinned; + } + + return requestedPinnedStatus; + } + /** * Remove a notification from the alerting entries. * @param key key of notification to remove @@ -747,10 +766,11 @@ public class HeadsUpManagerImpl protected void updatePinnedMode() { boolean hasPinnedNotification = hasPinnedNotificationInternal(); + mPinnedNotificationStatus = pinnedNotificationStatusInternal(); if (hasPinnedNotification == mHasPinnedNotification) { return; } - mLogger.logUpdatePinnedMode(hasPinnedNotification); + mLogger.logUpdatePinnedMode(hasPinnedNotification, mPinnedNotificationStatus); mHasPinnedNotification = hasPinnedNotification; if (mHasPinnedNotification) { MetricsLogger.count(mContext, "note_peek", 1); @@ -941,13 +961,20 @@ public class HeadsUpManagerImpl pw.println(mTouchableRegion); } - /** - * Returns if there are any pinned Heads Up Notifications or not. - */ + @Override public boolean hasPinnedHeadsUp() { return mHasPinnedNotification; } + @Override + @NonNull + public PinnedStatus pinnedHeadsUpStatus() { + if (!StatusBarNotifChips.isEnabled()) { + return mHasPinnedNotification ? PinnedStatus.PinnedBySystem : PinnedStatus.NotPinned; + } + return mPinnedNotificationStatus; + } + private boolean hasPinnedNotificationInternal() { for (String key : mHeadsUpEntryMap.keySet()) { HeadsUpEntry entry = getHeadsUpEntry(key); @@ -958,6 +985,16 @@ public class HeadsUpManagerImpl return false; } + private PinnedStatus pinnedNotificationStatusInternal() { + for (String key : mHeadsUpEntryMap.keySet()) { + HeadsUpEntry entry = getHeadsUpEntry(key); + if (entry.mEntry != null && entry.mEntry.isRowPinned()) { + return entry.mEntry.getPinnedStatus(); + } + } + return PinnedStatus.NotPinned; + } + /** * Unpins all pinned Heads Up Notifications. * @param userUnPinned The unpinned action is trigger by user real operation. @@ -1305,10 +1342,6 @@ public class HeadsUpManagerImpl } } - protected boolean isRowPinned() { - return mEntry != null && mEntry.isRowPinned(); - } - protected void setRowPinnedStatus(PinnedStatus pinnedStatus) { if (mEntry != null) mEntry.setRowPinnedStatus(pinnedStatus); mPinnedStatus.setValue(pinnedStatus); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLogger.kt index 80225c47e9ea..1ccc45b9c385 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLogger.kt @@ -44,8 +44,16 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { buffer.log(TAG, INFO, {}, { "release all immediately" }) } - fun logShowNotificationRequest(entry: NotificationEntry) { - buffer.log(TAG, INFO, { str1 = entry.logKey }, { "request: show notification $str1" }) + fun logShowNotificationRequest(entry: NotificationEntry, isPinnedByUser: Boolean) { + buffer.log( + TAG, + INFO, + { + str1 = entry.logKey + bool1 = isPinnedByUser + }, + { "request: show notification $str1. isPinnedByUser=$bool1" }, + ) } fun logAvalancheUpdate( @@ -86,8 +94,16 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { ) } - fun logShowNotification(entry: NotificationEntry) { - buffer.log(TAG, INFO, { str1 = entry.logKey }, { "show notification $str1" }) + fun logShowNotification(entry: NotificationEntry, isPinnedByUser: Boolean) { + buffer.log( + TAG, + INFO, + { + str1 = entry.logKey + bool1 = isPinnedByUser + }, + { "show notification $str1. isPinnedByUser=$bool1" }, + ) } fun logAutoRemoveScheduled(entry: NotificationEntry, delayMillis: Long, reason: String) { @@ -224,29 +240,33 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { buffer.log(TAG, INFO, { str1 = entry.logKey }, { "notification removed $str1 " }) } - fun logUpdateNotificationRequest(key: String, alert: Boolean, hasEntry: Boolean) { + fun logUpdateNotificationRequest( + key: String, + requestedPinnedStatus: PinnedStatus, + hasEntry: Boolean, + ) { buffer.log( TAG, INFO, { str1 = logKey(key) - bool1 = alert - bool2 = hasEntry + bool1 = hasEntry + str2 = requestedPinnedStatus.name }, - { "request: update notification $str1 alert: $bool1 hasEntry: $bool2" }, + { "request: update notification $str1. hasEntry: $bool1. requestedPinnedStatus: $str2" }, ) } - fun logUpdateNotification(key: String, alert: Boolean, hasEntry: Boolean) { + fun logUpdateNotification(key: String, requestedPinnedStatus: PinnedStatus, hasEntry: Boolean) { buffer.log( TAG, INFO, { str1 = logKey(key) - bool1 = alert - bool2 = hasEntry + bool1 = hasEntry + str2 = requestedPinnedStatus.name }, - { "update notification $str1 alert: $bool1 hasEntry: $bool2" }, + { "update notification $str1. hasEntry: $bool2. requestedPinnedStatus: $str2" }, ) } @@ -285,12 +305,18 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { ) } - fun logUpdatePinnedMode(hasPinnedNotification: Boolean) { + fun logUpdatePinnedMode( + hasPinnedNotification: Boolean, + pinnedNotificationStatus: PinnedStatus, + ) { buffer.log( TAG, INFO, - { bool1 = hasPinnedNotification }, - { "has pinned notification changed to $bool1" }, + { + bool1 = hasPinnedNotification + str1 = pinnedNotificationStatus.name + }, + { "has pinned notification changed to $bool1, status=$str1" }, ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt index 0f19d7288f6f..9dc3ed29570b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt @@ -18,13 +18,14 @@ package com.android.systemui.statusbar.notification.icon import android.app.Notification import android.content.Context +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.contentDescForNotification import javax.inject.Inject /** Testable wrapper around Context. */ -class IconBuilder @Inject constructor(private val context: Context) { +class IconBuilder @Inject constructor(@Main private val context: Context) { @JvmOverloads fun createIconView( entry: NotificationEntry, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt index 6dbb71463602..643ee249e75e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification.icon.ui.viewbinder import android.graphics.Color -import android.graphics.Rect import android.util.Log import android.view.View import android.view.ViewGroup @@ -53,7 +52,6 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.stateIn /** Binds a view-model to a [NotificationIconContainer]. */ @@ -71,10 +69,7 @@ object NotificationIconContainerViewBinder { launch { val contrastColorUtil = ContrastColorUtil.getInstance(view.context) val iconColors: StateFlow<NotificationIconColors> = - viewModel - .iconColors(displayId) - .mapNotNull { it.iconColors(view.viewBounds) } - .stateIn(this) + viewModel.iconColors(displayId).stateIn(this) viewModel.icons.bindIcons( logTag = "statusbar", view = view, @@ -374,18 +369,6 @@ fun NotifCollection.iconViewStoreBy(block: (IconPack) -> StatusBarIconView?) = getEntry(key)?.icons?.let(block) } -private val View.viewBounds: Rect - get() { - val tmpArray = intArrayOf(0, 0) - getLocationOnScreen(tmpArray) - return Rect( - /* left = */ tmpArray[0], - /* top = */ tmpArray[1], - /* right = */ left + width, - /* bottom = */ top + height, - ) - } - private suspend inline fun <T> Flow<T>.collectTracingEach( tag: String, crossinline collector: (T) -> Unit, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt index 83f56a092bc6..124bd2eece36 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt @@ -16,8 +16,6 @@ package com.android.systemui.statusbar.notification.icon.ui.viewbinder -import android.graphics.Rect -import android.view.View import com.android.app.tracing.traceSection import com.android.internal.util.ContrastColorUtil import com.android.systemui.res.R @@ -25,6 +23,7 @@ import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.StatusBarIconView.NO_COLOR import com.android.systemui.statusbar.notification.NotificationUtils import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconColors +import com.android.systemui.util.view.viewBoundsOnScreen import kotlinx.coroutines.flow.Flow object StatusBarIconViewBinder { @@ -60,25 +59,13 @@ object StatusBarIconViewBinder { val isPreL = java.lang.Boolean.TRUE == view.getTag(R.id.icon_is_pre_L) val isColorized = !isPreL || NotificationUtils.isGrayscale(view, contrastColorUtil) view.staticDrawableColor = - if (isColorized) colors.staticDrawableColor(view.viewBounds) else NO_COLOR + if (isColorized) colors.staticDrawableColor(view.viewBoundsOnScreen()) else NO_COLOR // Set the color for the overflow dot view.setDecorColor(colors.tint) } } } -private val View.viewBounds: Rect - get() { - val tmpArray = intArrayOf(0, 0) - getLocationOnScreen(tmpArray) - return Rect( - /* left = */ tmpArray[0], - /* top = */ tmpArray[1], - /* right = */ left + width, - /* bottom = */ top + height, - ) - } - private suspend inline fun <T> Flow<T>.collectTracingEach( tag: String, crossinline collector: (T) -> Unit, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt index 2365db451836..a9635dcd2bc9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt @@ -17,14 +17,6 @@ package com.android.systemui.statusbar.notification.icon.ui.viewmodel import android.graphics.Rect -/** - * Lookup the colors to use for the notification icons based on the bounds of the icon container. A - * result of `null` indicates that no color changes should be applied. - */ -fun interface NotificationIconColorLookup { - fun iconColors(viewBounds: Rect): NotificationIconColors? -} - /** Colors to apply to notification icons. */ interface NotificationIconColors { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt index f0b03065e637..2ba28a660116 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt @@ -68,18 +68,10 @@ constructor( .distinctUntilChanged() /** The colors with which to display the notification icons. */ - fun iconColors(displayId: Int): Flow<NotificationIconColorLookup> = + fun iconColors(displayId: Int): Flow<NotificationIconColors> = darkIconInteractor .darkState(displayId) - .map { (areas: Collection<Rect>, tint: Int) -> - NotificationIconColorLookup { viewBounds: Rect -> - if (DarkIconDispatcher.isInAreas(areas, viewBounds)) { - IconColorsImpl(tint, areas) - } else { - null - } - } - } + .map { (areas: Collection<Rect>, tint: Int) -> IconColorsImpl(tint, areas) } .flowOn(bgContext) .conflate() .distinctUntilChanged() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java index 9a7610ddd354..32ec02319241 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java @@ -28,7 +28,6 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.coordinator.HeadsUpCoordinator; -import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback; import com.android.systemui.statusbar.notification.row.RowContentBindParams; import com.android.systemui.statusbar.notification.row.RowContentBindStage; @@ -73,7 +72,10 @@ public class HeadsUpViewBinder { * Bind heads up view to the notification row. * @param callback callback after heads up view is bound */ - public void bindHeadsUpView(NotificationEntry entry, @Nullable BindCallback callback) { + public void bindHeadsUpView( + NotificationEntry entry, + boolean isPinnedByUser, + @Nullable HeadsUpBindCallback callback) { RowContentBindParams params = mStage.getStageParams(entry); final boolean isImportantMessage = mNotificationMessagingUtil.isImportantMessaging( entry.getSbn(), entry.getImportance()); @@ -84,16 +86,16 @@ public class HeadsUpViewBinder { CancellationSignal signal = mStage.requestRebind(entry, en -> { mLogger.entryBoundSuccessfully(entry); en.getRow().setUsesIncreasedHeadsUpHeight(params.useIncreasedHeadsUpHeight()); - // requestRebing promises that if we called cancel before this callback would be + // requestRebind promises that if we called cancel before this callback would be // invoked, then we will not enter this callback, and because we always cancel before // adding to this map, we know this will remove the correct signal. mOngoingBindCallbacks.remove(entry); if (callback != null) { - callback.onBindFinished(en); + callback.onHeadsUpBindFinished(en, isPinnedByUser); } }); abortBindCallback(entry); - mLogger.startBindingHun(entry); + mLogger.startBindingHun(entry, isPinnedByUser); mOngoingBindCallbacks.put(entry, signal); } @@ -129,4 +131,14 @@ public class HeadsUpViewBinder { mLogger.entryContentViewMarkedFreeable(entry); mStage.requestRebind(entry, e -> mLogger.entryUnbound(e)); } + + /** + * Interface for bind callback. + */ + public interface HeadsUpBindCallback { + /** + * Called when all views are fully bound on the notification. + */ + void onHeadsUpBindFinished(NotificationEntry entry, boolean isPinnedByUser); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt index c6d2861a8c68..e690fa5a36e2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt @@ -1,59 +1,63 @@ package com.android.systemui.statusbar.notification.interruption -import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject class HeadsUpViewBinderLogger @Inject constructor(@NotificationHeadsUpLog val buffer: LogBuffer) { - fun startBindingHun(entry: NotificationEntry) { - buffer.log(TAG, INFO, { - str1 = entry.logKey - }, { - "start binding heads up entry $str1 " - }) + fun startBindingHun(entry: NotificationEntry, isPinnedByUser: Boolean) { + buffer.log( + TAG, + INFO, + { + str1 = entry.logKey + bool1 = isPinnedByUser + }, + { "start binding heads up entry $str1. isPinnedByUser=$bool1 " }, + ) } fun currentOngoingBindingAborted(entry: NotificationEntry) { - buffer.log(TAG, INFO, { - str1 = entry.logKey - }, { - "aborted potential ongoing heads up entry binding $str1 " - }) + buffer.log( + TAG, + INFO, + { str1 = entry.logKey }, + { "aborted potential ongoing heads up entry binding $str1 " }, + ) } fun entryBoundSuccessfully(entry: NotificationEntry) { - buffer.log(TAG, INFO, { - str1 = entry.logKey - }, { - "heads up entry bound successfully $str1 " - }) + buffer.log( + TAG, + INFO, + { str1 = entry.logKey }, + { "heads up entry bound successfully $str1 " }, + ) } fun entryUnbound(entry: NotificationEntry) { - buffer.log(TAG, INFO, { - str1 = entry.logKey - }, { - "heads up entry unbound successfully $str1 " - }) + buffer.log( + TAG, + INFO, + { str1 = entry.logKey }, + { "heads up entry unbound successfully $str1 " }, + ) } fun entryContentViewMarkedFreeable(entry: NotificationEntry) { - buffer.log(TAG, INFO, { - str1 = entry.logKey - }, { - "start unbinding heads up entry $str1 " - }) + buffer.log(TAG, INFO, { str1 = entry.logKey }, { "start unbinding heads up entry $str1 " }) } fun entryBindStageParamsNullOnUnbind(entry: NotificationEntry) { - buffer.log(TAG, INFO, { - str1 = entry.logKey - }, { - "heads up entry bind stage params null on unbind $str1 " - }) + buffer.log( + TAG, + INFO, + { str1 = entry.logKey }, + { "heads up entry bind stage params null on unbind $str1 " }, + ) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt index 38eaf27ad358..e122ca888f45 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt @@ -77,6 +77,13 @@ constructor( contentBuilder.text = notification.text() contentBuilder.skeletonLargeIcon = null // TODO + val colorsFromNotif = recoveredBuilder.getColors(/* header= */ false) + contentBuilder.colors = + PromotedNotificationContentModel.Colors( + backgroundColor = colorsFromNotif.backgroundColor, + primaryTextColor = colorsFromNotif.primaryTextColor, + ) + recoveredBuilder.style?.extractContent(contentBuilder) ?: run { contentBuilder.style = Style.Ineligible } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt index 41ee3b992c5a..0af40437828e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.promoted.shared.model import android.annotation.DrawableRes import android.graphics.drawable.Icon +import androidx.annotation.ColorInt import com.android.internal.widget.NotificationProgressModel import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi @@ -39,6 +40,7 @@ data class PromotedNotificationContentModel( val title: CharSequence?, val text: CharSequence?, val skeletonLargeIcon: Icon?, // TODO(b/377568176): Make into an IconModel. + val colors: Colors, val style: Style, // for CallStyle: @@ -61,6 +63,7 @@ data class PromotedNotificationContentModel( var text: CharSequence? = null var skeletonLargeIcon: Icon? = null var style: Style = Style.Ineligible + var colors: Colors = Colors(backgroundColor = 0, primaryTextColor = 0) // for CallStyle: var personIcon: Icon? = null @@ -83,6 +86,7 @@ data class PromotedNotificationContentModel( title = title, text = text, skeletonLargeIcon = skeletonLargeIcon, + colors = colors, style = style, personIcon = personIcon, personName = personName, @@ -102,6 +106,9 @@ data class PromotedNotificationContentModel( } } + /** The colors used to display the notification. */ + data class Colors(@ColorInt val backgroundColor: Int, @ColorInt val primaryTextColor: Int) + /** The promotion-eligible style of a notification, or [Style.Ineligible] if not. */ enum class Style { BigPicture, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 5c51adadfd82..b4092cd785bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -37,7 +37,6 @@ import android.view.animation.Interpolator; import com.android.app.animation.Interpolators; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor.Configuration; -import com.android.settingslib.Utils; import com.android.systemui.Gefingerpoken; import com.android.systemui.res.R; import com.android.systemui.shade.TouchLogger; @@ -123,8 +122,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } private void updateColors() { - mNormalColor = Utils.getColorAttrDefaultColor(mContext, - com.android.internal.R.attr.materialColorSurfaceContainerHigh); + mNormalColor = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceContainerHigh); mTintedRippleColor = mContext.getColor( R.color.notification_ripple_tinted_color); mNormalRippleColor = mContext.getColor( 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 a8d59d83d1e9..6bfc9f07ffc4 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 @@ -40,6 +40,7 @@ import android.widget.TextView import com.android.internal.annotations.VisibleForTesting import com.android.systemui.res.R import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.shade.ShadeDisplayAware import javax.inject.Inject private const val TAG = "ChannelDialogController" @@ -58,11 +59,10 @@ private const val TAG = "ChannelDialogController" */ @SysUISingleton class ChannelEditorDialogController @Inject constructor( - c: Context, + @ShadeDisplayAware private val context: Context, private val noMan: INotificationManager, private val dialogBuilder: ChannelEditorDialog.Builder ) { - val context: Context = c.applicationContext private var prepared = false private lateinit var dialog: ChannelEditorDialog 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 c8811fd3b76d..5a52c379d0d6 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 @@ -1247,6 +1247,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } @Override + public PinnedStatus getPinnedStatus() { + return mPinnedStatus; + } + + @Override public int getPinnedHeadsUpHeight() { return getPinnedHeadsUpHeight(true /* atLeastMinHeight */); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java index ef6cad134534..f83a1d9b7833 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java @@ -40,6 +40,7 @@ import com.android.systemui.res.R; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.Roundable; import com.android.systemui.statusbar.notification.RoundableState; +import com.android.systemui.statusbar.notification.headsup.PinnedStatus; import com.android.systemui.statusbar.notification.stack.ExpandableViewState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.util.Compile; @@ -201,6 +202,11 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable, Ro return false; } + @NonNull + public PinnedStatus getPinnedStatus() { + return PinnedStatus.NotPinned; + } + public boolean isHeadsUpAnimatingAway() { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java index 61f4e96bf99a..5c4c253d1f98 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java @@ -21,7 +21,6 @@ import static android.app.Notification.COLOR_INVALID; import android.annotation.Nullable; import android.app.Flags; import android.content.Context; -import android.content.res.TypedArray; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; @@ -115,16 +114,9 @@ public class HybridNotificationView extends AlphaOptimizedLinearLayout } private void resolveThemeTextColors() { - try (TypedArray ta = mContext.getTheme().obtainStyledAttributes( - android.R.style.Theme_DeviceDefault_DayNight, new int[]{ - com.android.internal.R.attr.materialColorOnSurface, - com.android.internal.R.attr.materialColorOnSurfaceVariant - })) { - if (ta != null) { - mPrimaryTextColor = ta.getColor(0, mPrimaryTextColor); - mSecondaryTextColor = ta.getColor(1, mSecondaryTextColor); - } - } + mPrimaryTextColor = mContext.getColor(com.android.internal.R.color.materialColorOnSurface); + mSecondaryTextColor = mContext.getColor( + com.android.internal.R.color.materialColorOnSurfaceVariant); } public void bind(@Nullable CharSequence title, @Nullable CharSequence text, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java index 34ef63944f14..e440d2728263 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java @@ -35,7 +35,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.util.ContrastColorUtil; -import com.android.settingslib.Utils; import com.android.systemui.Dumpable; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.shared.NotificationAddXOnHoverToDismiss; @@ -83,8 +82,8 @@ public class NotificationBackgroundView extends View implements Dumpable, R.color.notification_state_color_light); mDarkColoredStatefulColors = getResources().getColorStateList( R.color.notification_state_color_dark); - mNormalColor = Utils.getColorAttrDefaultColor(mContext, - com.android.internal.R.attr.materialColorSurfaceContainerHigh); + mNormalColor = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceContainerHigh); mFocusOverlayStroke = getResources().getDimension(R.dimen.notification_focus_stroke_width); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index e141b7cf23ec..be9f60d4d5a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -43,7 +43,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; -import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; @@ -337,10 +336,7 @@ public class NotificationConversationInfo extends LinearLayout implements Drawable person = mIconFactory.getBaseIconDrawable(mShortcutInfo); if (person == null) { person = mContext.getDrawable(R.drawable.ic_person).mutate(); - TypedArray ta = mContext.obtainStyledAttributes( - new int[]{com.android.internal.R.attr.materialColorPrimary}); - int colorPrimary = ta.getColor(0, 0); - ta.recycle(); + int colorPrimary = mContext.getColor(com.android.internal.R.color.materialColorPrimary); person.setTint(colorPrimary); } ImageView image = findViewById(R.id.conversation_icon); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt index f8aff69f0531..9d13ab53ec71 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt @@ -21,7 +21,6 @@ import android.content.Context import android.graphics.drawable.AnimatedImageDrawable import android.view.View import android.view.ViewGroup -import android.view.ViewGroup.MarginLayoutParams import com.android.internal.widget.CachingIconView import com.android.internal.widget.ConversationLayout import com.android.internal.widget.MessagingGroup @@ -94,13 +93,6 @@ class NotificationConversationTemplateViewWrapper( // Reinspect the notification. Before the super call, because the super call also updates // the transformation types and we need to have our values set by then. resolveViews() - if (Flags.notificationsRedesignAppIcons() && row.isShowingAppIcon) { - // Override the margins to be 2dp instead of 4dp according to the new design if we're - // showing the app icon. - val lp = badgeIconView.layoutParams as MarginLayoutParams - lp.setMargins(2, 2, 2, 2) - badgeIconView.layoutParams = lp - } super.onContentUpdated(row) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java index 182fba34cafb..752a8abf055d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java @@ -38,7 +38,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.internal.util.ContrastColorUtil; import com.android.internal.widget.CachingIconView; -import com.android.settingslib.Utils; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.TransformableView; import com.android.systemui.statusbar.notification.FeedbackIcon; @@ -344,9 +343,8 @@ public abstract class NotificationViewWrapper implements TransformableView { if (customBackgroundColor != 0) { return customBackgroundColor; } - return Utils.getColorAttr(mView.getContext(), - com.android.internal.R.attr.materialColorSurfaceContainerHigh) - .getDefaultColor(); + return mView.getContext().getColor( + com.android.internal.R.color.materialColorSurfaceContainerHigh); } public void setLegacy(boolean legacy) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 99edf652f289..00cd8ce87738 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -22,7 +22,6 @@ import android.app.Notification; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; -import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.Path.Direction; @@ -1519,10 +1518,9 @@ public class NotificationChildrenContainer extends ViewGroup int color = mContainingNotification.getNotificationColor(); Resources.Theme theme = new ContextThemeWrapper(mContext, com.android.internal.R.style.Theme_DeviceDefault_DayNight).getTheme(); - try (TypedArray ta = theme.obtainStyledAttributes( - new int[]{com.android.internal.R.attr.materialColorPrimary})) { - color = ta.getColor(0, color); - } + + color = mContext.getColor(com.android.internal.R.color.materialColorPrimary); + mHybridGroupManager.setOverflowNumberColor(mOverflowNumber, color); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index b9e38abf8ab2..072089981cc7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -83,7 +83,6 @@ import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.policy.SystemBarUtils; import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardSliceView; -import com.android.settingslib.Utils; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.ExpandHelper; @@ -2630,6 +2629,7 @@ public class NotificationStackScrollLayout private void updateContentHeight() { if (SceneContainerFlag.isEnabled()) { updateIntrinsicStackHeight(); + updateStackEndHeightAndStackHeight(mAmbientState.getExpansionFraction()); return; } @@ -4729,10 +4729,10 @@ public class NotificationStackScrollLayout * Update colors of section headers, shade footer, and empty shade views. */ void updateDecorViews() { - final @ColorInt int onSurface = Utils.getColorAttrDefaultColor( - mContext, com.android.internal.R.attr.materialColorOnSurface); - final @ColorInt int onSurfaceVariant = Utils.getColorAttrDefaultColor( - mContext, com.android.internal.R.attr.materialColorOnSurfaceVariant); + final @ColorInt int onSurface = mContext.getColor( + com.android.internal.R.color.materialColorOnSurface); + final @ColorInt int onSurfaceVariant = mContext.getColor( + com.android.internal.R.color.materialColorOnSurfaceVariant); ColorUpdateLogger colorUpdateLogger = ColorUpdateLogger.getInstance(); if (colorUpdateLogger != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt index bffcae99e7f6..b4561686b7b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt @@ -147,8 +147,7 @@ constructor( // The footer needs to be re-inflated every time the theme or the font size changes. configuration .inflateLayout<FooterView>( - if (NotifRedesignFooter.isEnabled) - R.layout.status_bar_notification_footer_redesign + if (NotifRedesignFooter.isEnabled) R.layout.notification_2025_footer else R.layout.status_bar_notification_footer, parentView, attachToRoot = false, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt index 8f4279e80376..a324e6df8a33 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.phone import com.android.systemui.CoreStartable -import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener import javax.inject.Inject @@ -27,8 +27,8 @@ import javax.inject.Inject class ConfigurationControllerStartable @Inject constructor( - @GlobalConfig private val configurationController: ConfigurationController, - private val listeners: Set<@JvmSuppressWildcards ConfigurationListener> + @Main private val configurationController: ConfigurationController, + private val listeners: Set<@JvmSuppressWildcards ConfigurationListener>, ) : CoreStartable { override fun start() { listeners.forEach { configurationController.addCallback(it) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index 6cad68ffe8fb..53a29505510b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -23,6 +23,7 @@ import android.util.MathUtils; import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.ViewClippingUtil; @@ -36,6 +37,7 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.HeadsUpStatusBarView; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.core.StatusBarRootModernization; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.SourceType; @@ -153,7 +155,7 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { - if (shouldBeVisible()) { + if (shouldHeadsUpStatusBarBeVisible()) { updateTopEntry(); // trigger scroller to notify the latest panel translation @@ -217,35 +219,54 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar private void updateTopEntry() { NotificationEntry newEntry = null; - if (shouldBeVisible()) { + if (shouldHeadsUpStatusBarBeVisible()) { newEntry = mHeadsUpManager.getTopEntry(); } NotificationEntry previousEntry = mView.getShowingEntry(); mView.setEntry(newEntry); if (newEntry != previousEntry) { if (newEntry == null) { - // no heads up anymore, lets start the disappear animation + // No longer heads up setPinnedStatus(PinnedStatus.NotPinned); } else if (previousEntry == null) { - // We now have a headsUp and didn't have one before. Let's start the disappear - // animation - setPinnedStatus(PinnedStatus.PinnedBySystem); + // We now have a heads up when we didn't have one before + setPinnedStatus(newEntry.getPinnedStatus()); } - String isolatedIconKey; - if (newEntry != null) { - isolatedIconKey = newEntry.getRepresentativeEntry().getKey(); + mHeadsUpNotificationIconInteractor.setIsolatedIconNotificationKey( + getIsolatedIconKey(newEntry)); + } + } + + private static @Nullable String getIsolatedIconKey(NotificationEntry newEntry) { + if (newEntry == null) { + return null; + } + if (StatusBarNotifChips.isEnabled()) { + // If the flag is on, only show the isolated icon if the HUN is pinned by the + // *system*. (If the HUN was pinned by the user, then the user tapped the + // notification status bar chip and we want to keep the chip showing.) + if (newEntry.getPinnedStatus() == PinnedStatus.PinnedBySystem) { + return newEntry.getRepresentativeEntry().getKey(); } else { - isolatedIconKey = null; + return null; } - mHeadsUpNotificationIconInteractor.setIsolatedIconNotificationKey(isolatedIconKey); + } else { + // If the flag is off, we know all HUNs are pinned by the system and should show + // the isolated icon + return newEntry.getRepresentativeEntry().getKey(); } } private void setPinnedStatus(PinnedStatus pinnedStatus) { if (mPinnedStatus != pinnedStatus) { mPinnedStatus = pinnedStatus; - if (pinnedStatus.isPinned()) { + + boolean shouldShowHunStatusBar = StatusBarNotifChips.isEnabled() + ? mPinnedStatus == PinnedStatus.PinnedBySystem + // If the flag isn't enabled, all HUNs get the normal treatment. + : mPinnedStatus.isPinned(); + if (shouldShowHunStatusBar) { updateParentClipping(false /* shouldClip */); mView.setVisibility(View.VISIBLE); show(mView); @@ -333,23 +354,36 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar return mPinnedStatus; } - /** - * Should the headsup status bar view be visible right now? This may be different from isShown, - * since the headsUp manager might not have notified us yet of the state change. - * - * @return if the heads up status bar view should be shown - * @deprecated use HeadsUpNotificationInteractor.showHeadsUpStatusBar instead. - */ - public boolean shouldBeVisible() { + /** True if the device's current state allows us to show HUNs and false otherwise. */ + private boolean canShowHeadsUp() { boolean notificationsShown = !mWakeUpCoordinator.getNotificationsFullyHidden(); - boolean canShow = !isExpanded() && notificationsShown; if (mBypassController.getBypassEnabled() && (mStatusBarStateController.getState() == StatusBarState.KEYGUARD || mKeyguardStateController.isKeyguardGoingAway()) && notificationsShown) { - canShow = true; + return true; + } + return !isExpanded() && notificationsShown; + } + + /** + * True if the headsup status bar view (which has just the HUN icon and app name) should be + * visible right now and false otherwise. + * + * @deprecated use {@link com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor#getStatusBarHeadsUpState()} + * instead. + */ + @Deprecated + public boolean shouldHeadsUpStatusBarBeVisible() { + if (StatusBarNotifChips.isEnabled()) { + return canShowHeadsUp() + && mHeadsUpManager.pinnedHeadsUpStatus() == PinnedStatus.PinnedBySystem; + // Note: This means that if mHeadsUpManager.pinnedHeadsUpStatus() == PinnedByUser, + // #updateTopEntry won't do anything, so mPinnedStatus will remain as NotPinned and will + // *not* update to PinnedByUser. + } else { + return canShowHeadsUp() && mHeadsUpManager.hasPinnedHeadsUp(); } - return canShow && mHeadsUpManager.hasPinnedHeadsUp(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt index f19d707046f1..2467e0890100 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt @@ -39,10 +39,12 @@ import com.android.systemui.shade.ShadeExpandsOnStatusBarLongPress import com.android.systemui.shade.ShadeLogger import com.android.systemui.shade.ShadeViewController import com.android.systemui.shade.StatusBarLongPressGestureDetector +import com.android.systemui.shade.data.repository.ShadeDisplaysRepository import com.android.systemui.shade.display.StatusBarTouchShadeDisplayPolicy import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator +import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.ConfigurationController @@ -83,6 +85,7 @@ private constructor( private val darkIconDispatcher: DarkIconDispatcher, private val statusBarContentInsetsProvider: StatusBarContentInsetsProvider, private val lazyStatusBarShadeDisplayPolicy: Lazy<StatusBarTouchShadeDisplayPolicy>, + private val shadeDisplaysRepository: ShadeDisplaysRepository, ) : ViewController<PhoneStatusBarView>(view) { private lateinit var battery: BatteryMeterView @@ -296,7 +299,19 @@ private constructor( return true } } - return shadeViewController.handleExternalTouch(event) + + // With the StatusBarConnectedDisplays changes, status bar touches should result in + // shade interaction only if ShadeWindowGoesAround.isEnabled or if touch is on the + // display which currently hosts the shade. + return if ( + !StatusBarConnectedDisplays.isEnabled || + ShadeWindowGoesAround.isEnabled || + context.displayId == shadeDisplaysRepository.displayId.value + ) { + shadeViewController.handleExternalTouch(event) + } else { + false + } } } @@ -352,6 +367,7 @@ private constructor( @DisplaySpecific private val darkIconDispatcher: DarkIconDispatcher, private val statusBarContentInsetsProviderStore: StatusBarContentInsetsProviderStore, private val lazyStatusBarShadeDisplayPolicy: Lazy<StatusBarTouchShadeDisplayPolicy>, + private val shadeDisplaysRepository: ShadeDisplaysRepository, ) { fun create(view: PhoneStatusBarView): PhoneStatusBarViewController { val statusBarMoveFromCenterAnimationController = @@ -380,6 +396,7 @@ private constructor( darkIconDispatcher, statusBarContentInsetsProviderStore.defaultDisplay, lazyStatusBarShadeDisplayPolicy, + shadeDisplaysRepository, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index e7c6fb46f984..324db79a4078 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -51,7 +51,6 @@ import com.android.internal.util.function.TriConsumer; import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; -import com.android.settingslib.Utils; import com.android.systemui.Dumpable; import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants; @@ -82,9 +81,6 @@ import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.wakelock.DelayedWakeLock; import com.android.systemui.util.wakelock.WakeLock; -import kotlinx.coroutines.CoroutineDispatcher; -import kotlinx.coroutines.ExperimentalCoroutinesApi; - import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -93,6 +89,9 @@ import java.util.function.Consumer; import javax.inject.Inject; +import kotlinx.coroutines.CoroutineDispatcher; +import kotlinx.coroutines.ExperimentalCoroutinesApi; + /** * Controls both the scrim behind the notifications and in front of the notifications (when a * security method gets shown). @@ -1532,17 +1531,17 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private void updateThemeColors() { if (mScrimBehind == null) return; - int background = Utils.getColorAttr(mScrimBehind.getContext(), - com.android.internal.R.attr.materialColorSurfaceDim).getDefaultColor(); - int accent = Utils.getColorAttr(mScrimBehind.getContext(), - com.android.internal.R.attr.materialColorPrimary).getDefaultColor(); + int background = mScrimBehind.getContext().getColor( + com.android.internal.R.color.materialColorSurfaceDim); + int accent = mScrimBehind.getContext().getColor( + com.android.internal.R.color.materialColorPrimary); mColors.setMainColor(background); mColors.setSecondaryColor(accent); final boolean isBackgroundLight = !ContrastColorUtil.isColorDark(background); mColors.setSupportsDarkText(isBackgroundLight); - int surface = Utils.getColorAttr(mScrimBehind.getContext(), - com.android.internal.R.attr.materialColorSurface).getDefaultColor(); + int surface = mScrimBehind.getContext().getColor( + com.android.internal.R.color.materialColorSurface); for (ScrimState state : ScrimState.values()) { state.setSurfaceColor(surface); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index b3cc047251ed..12684fa8518a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -37,10 +37,12 @@ import androidx.annotation.NonNull; import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.InitController; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.res.R; +import com.android.systemui.scene.shared.flag.SceneContainerFlag; import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.QuickSettingsController; import com.android.systemui.shade.ShadeViewController; @@ -59,6 +61,7 @@ import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource; import com.android.systemui.statusbar.notification.domain.interactor.NotificationAlertsInteractor; +import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor; import com.android.systemui.statusbar.notification.interruption.VisualInterruptionCondition; import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider; @@ -69,7 +72,6 @@ import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; -import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import java.util.Set; @@ -102,6 +104,7 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu private final IStatusBarService mBarService; private final DynamicPrivacyController mDynamicPrivacyController; private final NotificationListContainer mNotifListContainer; + private final DeviceUnlockedInteractor mDeviceUnlockedInteractor; private final QuickSettingsController mQsController; protected boolean mVrMode; @@ -133,7 +136,8 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu VisualInterruptionDecisionProvider visualInterruptionDecisionProvider, NotificationRemoteInputManager remoteInputManager, NotificationRemoteInputManager.Callback remoteInputManagerCallback, - NotificationListContainer notificationListContainer) { + NotificationListContainer notificationListContainer, + DeviceUnlockedInteractor deviceUnlockedInteractor) { mActivityStarter = activityStarter; mKeyguardStateController = keyguardStateController; mNotificationPanel = panel; @@ -160,6 +164,7 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); mNotifListContainer = notificationListContainer; + mDeviceUnlockedInteractor = deviceUnlockedInteractor; IVrManager vrManager = IVrManager.Stub.asInterface(ServiceManager.getService( Context.VR_SERVICE)); @@ -248,14 +253,25 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { mShadeTransitionController.goToLockedShade(clickedEntry.getRow()); } else if (clickedEntry.isSensitive().getValue() - && mDynamicPrivacyController.isInLockedDownShade()) { + && isInLockedDownShade()) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); + // launch the bouncer mActivityStarter.dismissKeyguardThenExecute(() -> false /* dismissAction */ , null /* cancelRunnable */, false /* afterKeyguardGone */); } } } + /** @return true if the Shade is shown over the Lockscreen, and the device is locked */ + private boolean isInLockedDownShade() { + if (SceneContainerFlag.isEnabled()) { + return mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED + && !mDeviceUnlockedInteractor.getDeviceUnlockStatus().getValue().isUnlocked(); + } else { + return mDynamicPrivacyController.isInLockedDownShade(); + } + } + @Override public boolean isDeviceInVrMode() { return mVrMode; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java index b9cba9903466..d0d0b5c402e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java @@ -29,7 +29,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.settingslib.Utils; import com.android.systemui.res.R; import com.android.wm.shell.shared.animation.Interpolators; @@ -51,8 +50,8 @@ public class TapAgainView extends TextView { } void updateColor() { - final @ColorInt int onSurface = Utils.getColorAttrDefaultColor(mContext, - com.android.internal.R.attr.materialColorOnSurface); + final @ColorInt int onSurface = mContext.getColor( + com.android.internal.R.color.materialColorOnSurface); setTextColor(onSurface); setBackground(getResources().getDrawable(R.drawable.rounded_bg_full, mContext.getTheme())); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index 724ba8cab352..d257288637df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -627,8 +627,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue StatusBarRootModernization.assertInLegacyMode(); // TODO(b/328393714) use HeadsUpNotificationInteractor.showHeadsUpStatusBar instead. - boolean headsUpVisible = - mHomeStatusBarComponent.getHeadsUpAppearanceController().shouldBeVisible(); + boolean headsUpVisible = mHomeStatusBarComponent + .getHeadsUpAppearanceController() + .shouldHeadsUpStatusBarBeVisible(); if (SceneContainerFlag.isEnabled()) { // With the scene container, only use the value calculated by the view model to diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt index 4b71c0268f11..b7ccfa01c92c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt @@ -21,17 +21,22 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.Logger +import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor +import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLog import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel +import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn /** @@ -47,7 +52,9 @@ import kotlinx.coroutines.flow.stateIn @SysUISingleton class OngoingCallInteractor @Inject constructor( @Application private val scope: CoroutineScope, - activityManagerRepository: ActivityManagerRepository, + private val activityManagerRepository: ActivityManagerRepository, + private val statusBarModeRepositoryStore: StatusBarModeRepositoryStore, + private val statusBarWindowControllerStore: StatusBarWindowControllerStore, activeNotificationsInteractor: ActiveNotificationsInteractor, @OngoingCallLog private val logBuffer: LogBuffer, ) { @@ -58,46 +65,78 @@ class OngoingCallInteractor @Inject constructor( */ val ongoingCallState: StateFlow<OngoingCallModel> = activeNotificationsInteractor.ongoingCallNotification - .flatMapLatest { notificationModel -> - when (notificationModel) { - null -> { - logger.d("No active call notification - hiding chip") - flowOf(OngoingCallModel.NoCall) - } + .flatMapLatest { notification -> + createOngoingCallStateFlow( + notification = notification + ) + } + .onEach { state -> + setStatusBarRequiredForOngoingCall(state) + } + .stateIn( + scope = scope, + started = SharingStarted.WhileSubscribed(), + initialValue = OngoingCallModel.NoCall + ) + + private fun createOngoingCallStateFlow( + notification: ActiveNotificationModel? + ): Flow<OngoingCallModel> { + if (notification == null) { + logger.d("No active call notification - hiding chip") + return flowOf(OngoingCallModel.NoCall) + } + + return combine( + flowOf(notification), + activityManagerRepository.createIsAppVisibleFlow( + creationUid = notification.uid, + logger = logger, + identifyingLogTag = TAG, + ) + ) { model, isVisible -> + deriveOngoingCallState(model, isVisible) + } + } - else -> combine( - flowOf(notificationModel), - activityManagerRepository.createIsAppVisibleFlow( - creationUid = notificationModel.uid, - logger = logger, - identifyingLogTag = TAG, - ), - ) { model, isVisible -> - when { - isVisible -> { - logger.d({ "Call app is visible: uid=$int1" }) { - int1 = model.uid - } - OngoingCallModel.InCallWithVisibleApp - } + private fun deriveOngoingCallState( + model: ActiveNotificationModel, + isVisible: Boolean + ): OngoingCallModel { + return when { + isVisible -> { + logger.d({ "Call app is visible: uid=$int1" }) { + int1 = model.uid + } + OngoingCallModel.InCallWithVisibleApp + } - else -> { - logger.d({ "Active call detected: startTime=$long1 hasIcon=$bool1" }) { - long1 = model.whenTime - bool1 = model.statusBarChipIconView != null - } - OngoingCallModel.InCall( - startTimeMs = model.whenTime, - notificationIconView = model.statusBarChipIconView, - intent = model.contentIntent, - notificationKey = model.key, - ) - } - } - } + else -> { + logger.d({ "Active call detected: startTime=$long1 hasIcon=$bool1" }) { + long1 = model.whenTime + bool1 = model.statusBarChipIconView != null } + OngoingCallModel.InCall( + startTimeMs = model.whenTime, + notificationIconView = model.statusBarChipIconView, + intent = model.contentIntent, + notificationKey = model.key + ) } - .stateIn(scope, SharingStarted.WhileSubscribed(), OngoingCallModel.NoCall) + } + } + + private fun setStatusBarRequiredForOngoingCall(state: OngoingCallModel) { + val statusBarRequired = state is OngoingCallModel.InCall + // TODO(b/382808183): Create a single repository that can be utilized in + // `statusBarModeRepositoryStore` and `statusBarWindowControllerStore` so we do not need + // two separate calls to force the status bar to stay visible. + statusBarModeRepositoryStore.defaultDisplay.setOngoingProcessRequiresStatusBarVisible( + statusBarRequired + ) + statusBarWindowControllerStore.defaultDisplay + .setOngoingProcessRequiresStatusBarVisible(statusBarRequired) + } companion object { private val TAG = "OngoingCall" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileContentDescriptionViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileContentDescriptionViewBinder.kt new file mode 100644 index 000000000000..c720b1df1e62 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileContentDescriptionViewBinder.kt @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.pipeline.mobile.ui.binder + +import android.view.View +import com.android.systemui.statusbar.pipeline.mobile.ui.model.MobileContentDescription + +object MobileContentDescriptionViewBinder { + fun bind(contentDescription: MobileContentDescription?, view: View) { + view.contentDescription = + when (contentDescription) { + null -> null + else -> contentDescription.loadContentDescription(view.context) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt index 31d349eb4cca..788f041b38c0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt @@ -29,9 +29,9 @@ import androidx.core.view.isVisible import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import com.android.app.tracing.coroutines.launchTraced as launch import com.android.settingslib.graph.SignalDrawable import com.android.systemui.Flags.statusBarStaticInoutIndicators -import com.android.systemui.common.ui.binder.ContentDescriptionViewBinder import com.android.systemui.common.ui.binder.IconViewBinder import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.DarkIconDispatcher @@ -48,12 +48,8 @@ import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarViewBin import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged -import com.android.app.tracing.coroutines.launchTraced as launch -private data class Colors( - @ColorInt val tint: Int, - @ColorInt val contrast: Int, -) +private data class Colors(@ColorInt val tint: Int, @ColorInt val contrast: Int) object MobileIconBinder { /** Binds the view to the view-model, continuing to update the former based on the latter */ @@ -87,7 +83,7 @@ object MobileIconBinder { MutableStateFlow( Colors( tint = DarkIconDispatcher.DEFAULT_ICON_TINT, - contrast = DarkIconDispatcher.DEFAULT_INVERSE_ICON_TINT + contrast = DarkIconDispatcher.DEFAULT_INVERSE_ICON_TINT, ) ) val decorTint: MutableStateFlow<Int> = MutableStateFlow(viewModel.defaultColor) @@ -105,7 +101,7 @@ object MobileIconBinder { viewModel.verboseLogger?.logBinderReceivedVisibility( view, viewModel.subscriptionId, - isVisible + isVisible, ) view.isVisible = isVisible // [StatusIconContainer] can get out of sync sometimes. Make sure to @@ -152,7 +148,7 @@ object MobileIconBinder { launch { viewModel.contentDescription.distinctUntilChanged().collect { - ContentDescriptionViewBinder.bind(it, view) + MobileContentDescriptionViewBinder.bind(it, view) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/model/MobileContentDescription.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/model/MobileContentDescription.kt new file mode 100644 index 000000000000..84fa07379a49 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/model/MobileContentDescription.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.pipeline.mobile.ui.model + +import android.annotation.StringRes +import android.content.Context +import com.android.systemui.res.R + +sealed interface MobileContentDescription { + fun loadContentDescription(context: Context): String + + /** + * Content description for cellular parameterizes the [networkName] which comes from the system + */ + data class Cellular(val networkName: String, @StringRes val levelDescriptionRes: Int) : + MobileContentDescription { + override fun loadContentDescription(context: Context): String = + context.getString( + R.string.accessibility_phone_string_format, + networkName, + context.getString(levelDescriptionRes), + ) + } + + data class SatelliteContentDescription(@StringRes val resId: Int) : MobileContentDescription { + override fun loadContentDescription(context: Context): String = + context.getString(this.resId) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt index 103b0e3a6f27..0bd3426712bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel -import com.android.settingslib.AccessibilityContentDescriptions import com.android.systemui.Flags.statusBarStaticInoutIndicators import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.shared.model.Icon @@ -28,6 +27,7 @@ import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.Airpla import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel +import com.android.systemui.statusbar.pipeline.mobile.ui.model.MobileContentDescription import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import kotlinx.coroutines.CoroutineScope @@ -50,7 +50,7 @@ interface MobileIconViewModelCommon { /** True if this view should be visible at all. */ val isVisible: StateFlow<Boolean> val icon: Flow<SignalIconModel> - val contentDescription: Flow<ContentDescription?> + val contentDescription: Flow<MobileContentDescription?> val roaming: Flow<Boolean> /** The RAT icon (LTE, 3G, 5G, etc) to be displayed. Null if we shouldn't show anything */ val networkTypeIcon: Flow<Icon.Resource?> @@ -95,10 +95,7 @@ class MobileIconViewModel( } private val satelliteProvider by lazy { - CarrierBasedSatelliteViewModelImpl( - subscriptionId, - iconInteractor, - ) + CarrierBasedSatelliteViewModelImpl(subscriptionId, iconInteractor) } /** @@ -123,7 +120,7 @@ class MobileIconViewModel( override val icon: Flow<SignalIconModel> = vmProvider.flatMapLatest { it.icon } - override val contentDescription: Flow<ContentDescription?> = + override val contentDescription: Flow<MobileContentDescription?> = vmProvider.flatMapLatest { it.contentDescription } override val roaming: Flow<Boolean> = vmProvider.flatMapLatest { it.roaming } @@ -154,8 +151,7 @@ private class CarrierBasedSatelliteViewModelImpl( override val isVisible: StateFlow<Boolean> = MutableStateFlow(true) override val icon: Flow<SignalIconModel> = interactor.signalLevelIcon - override val contentDescription: Flow<ContentDescription> = - MutableStateFlow(ContentDescription.Loaded("")) + override val contentDescription: Flow<MobileContentDescription?> = MutableStateFlow(null) /** These fields are not used for satellite icons currently */ override val roaming: Flow<Boolean> = flowOf(false) @@ -206,27 +202,42 @@ private class CellularIconViewModel( override val icon: Flow<SignalIconModel> = iconInteractor.signalLevelIcon - override val contentDescription: Flow<ContentDescription?> = - iconInteractor.signalLevelIcon - .map { - // We expect the signal icon to be cellular here since this is the cellular vm - if (it !is SignalIconModel.Cellular) { - null - } else { - val resId = - AccessibilityContentDescriptions.getDescriptionForLevel( - it.level, - it.numberOfLevels + override val contentDescription: Flow<MobileContentDescription?> = + combine(iconInteractor.signalLevelIcon, iconInteractor.networkName) { icon, nameModel -> + when (icon) { + is SignalIconModel.Cellular -> + MobileContentDescription.Cellular( + nameModel.name, + icon.levelDescriptionRes(), ) - if (resId != 0) { - ContentDescription.Resource(resId) - } else { - null - } + else -> null } } .stateIn(scope, SharingStarted.WhileSubscribed(), null) + private fun SignalIconModel.Cellular.levelDescriptionRes() = + when (level) { + 0 -> R.string.accessibility_no_signal + 1 -> R.string.accessibility_one_bar + 2 -> R.string.accessibility_two_bars + 3 -> R.string.accessibility_three_bars + 4 -> { + if (numberOfLevels == 6) { + R.string.accessibility_four_bars + } else { + R.string.accessibility_signal_full + } + } + 5 -> { + if (numberOfLevels == 6) { + R.string.accessibility_signal_full + } else { + R.string.accessibility_no_signal + } + } + else -> R.string.accessibility_no_signal + } + private val showNetworkTypeIcon: Flow<Boolean> = combine( iconInteractor.isDataConnected, @@ -248,10 +259,9 @@ private class CellularIconViewModel( .stateIn(scope, SharingStarted.WhileSubscribed(), false) override val networkTypeIcon: Flow<Icon.Resource?> = - combine( - iconInteractor.networkTypeIconGroup, - showNetworkTypeIcon, - ) { networkTypeIconGroup, shouldShow -> + combine(iconInteractor.networkTypeIconGroup, showNetworkTypeIcon) { + networkTypeIconGroup, + shouldShow -> val desc = if (networkTypeIconGroup.contentDescription != 0) ContentDescription.Resource(networkTypeIconGroup.contentDescription) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt index c52275a9eaa4..6e9e1ec7253c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt @@ -41,6 +41,7 @@ import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationSt import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor +import com.android.systemui.statusbar.notification.headsup.PinnedStatus import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor import com.android.systemui.statusbar.phone.domain.interactor.LightsOutInteractor import com.android.systemui.statusbar.pipeline.shared.domain.interactor.CollapsedStatusBarInteractor @@ -235,14 +236,18 @@ constructor( override val isClockVisible: Flow<VisibilityModel> = combine( shouldHomeStatusBarBeVisible, - headsUpNotificationInteractor.showHeadsUpStatusBar, + headsUpNotificationInteractor.statusBarHeadsUpState, collapsedStatusBarInteractor.visibilityViaDisableFlags, - ) { shouldStatusBarBeVisible, showHeadsUp, visibilityViaDisableFlags -> + ) { shouldStatusBarBeVisible, headsUpState, visibilityViaDisableFlags -> + val hideClockForHeadsUp = headsUpState == PinnedStatus.PinnedBySystem val showClock = - shouldStatusBarBeVisible && visibilityViaDisableFlags.isClockAllowed && !showHeadsUp + shouldStatusBarBeVisible && + visibilityViaDisableFlags.isClockAllowed && + !hideClockForHeadsUp // Always use View.INVISIBLE here, so that animations work VisibilityModel(showClock.toVisibleOrInvisible(), visibilityViaDisableFlags.animate) } + override val isNotificationIconContainerVisible: Flow<VisibilityModel> = combine( shouldHomeStatusBarBeVisible, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index 16d5f8d30593..2b0bf1a3d343 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -24,7 +24,6 @@ import android.app.ActivityManager; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.ColorStateList; -import android.content.res.TypedArray; import android.graphics.BlendMode; import android.graphics.Color; import android.graphics.PorterDuff; @@ -174,11 +173,8 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene mTextWatcher = new SendButtonTextWatcher(); mEditorActionHandler = new EditorActionHandler(); mUiEventLogger = Dependency.get(UiEventLogger.class); - TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{ - com.android.internal.R.attr.materialColorSurfaceDim, - }); - mLastBackgroundColor = ta.getColor(0, 0); - ta.recycle(); + mLastBackgroundColor = getContext().getColor( + com.android.internal.R.color.materialColorSurfaceDim); } // TODO(b/193539698): move to Controller, since we're just directly accessing a system service @@ -229,13 +225,10 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene textColor = mContext.getColorStateList(R.color.remote_input_text); hintColor = mContext.getColor(R.color.remote_input_hint); deleteFgColor = textColor.getDefaultColor(); - try (TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{ - com.android.internal.R.attr.materialColorSurfaceDim, - com.android.internal.R.attr.materialColorSurfaceVariant - })) { - editBgColor = ta.getColor(0, backgroundColor); - deleteBgColor = ta.getColor(1, Color.GRAY); - } + editBgColor = getContext().getColor( + com.android.internal.R.color.materialColorSurfaceDim); + deleteBgColor = getContext().getColor( + com.android.internal.R.color.materialColorSurfaceVariant); } mEditText.setTextColor(textColor); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java index 9187e3c43380..d1e807f18196 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java @@ -23,7 +23,6 @@ import android.os.UserManager; import com.android.internal.R; import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager; import com.android.settingslib.notification.modes.ZenIconLoader; -import com.android.systemui.common.ui.GlobalConfig; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Application; import com.android.systemui.dagger.qualifiers.Main; @@ -111,7 +110,7 @@ public interface StatusBarPolicyModule { * wrong updates in case of secondary displays. */ @Binds - ConfigurationController bindConfigurationController(@GlobalConfig ConfigurationController impl); + ConfigurationController bindConfigurationController(@Main ConfigurationController impl); /** */ @Binds @@ -189,14 +188,14 @@ public interface StatusBarPolicyModule { /** */ @Binds @SysUISingleton - @GlobalConfig + @Main ConfigurationForwarder provideGlobalConfigurationForwarder( - @GlobalConfig ConfigurationController configurationController); + @Main ConfigurationController configurationController); /** */ @Provides @SysUISingleton - @GlobalConfig + @Main static ConfigurationController provideGlobalConfigurationController( @Application Context context, ConfigurationControllerImpl.Factory factory) { return factory.create(context); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModel.kt index fe1d64736991..6175ea190697 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModel.kt @@ -35,6 +35,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn /** @@ -59,7 +60,7 @@ constructor( private val showingHeadsUpStatusBar: Flow<Boolean> = if (SceneContainerFlag.isEnabled) { - headsUpNotificationInteractor.showHeadsUpStatusBar + headsUpNotificationInteractor.statusBarHeadsUpState.map { it.isPinned } } else { flowOf(false) } diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt index 7475388e80c2..0a10b440644d 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt @@ -18,7 +18,7 @@ package com.android.systemui.temporarydisplay.chipbar import android.os.VibrationEffect import android.view.View -import androidx.annotation.AttrRes +import androidx.annotation.ColorRes import com.android.internal.logging.InstanceId import com.android.systemui.common.shared.model.Text import com.android.systemui.common.shared.model.TintedIcon @@ -52,8 +52,8 @@ data class ChipbarInfo( ) : TemporaryViewInfo() { companion object { // LINT.IfChange - @AttrRes val DEFAULT_ICON_TINT = com.android.internal.R.attr.materialColorOnSecondaryFixed - // LINT.ThenChange(systemui/res/layout/chipbar.xml) + @ColorRes val DEFAULT_ICON_TINT = com.android.internal.R.color.materialColorOnSecondaryFixed + // LINT.ThenChange(/packages/SystemUI/res/layout/chipbar.xml) } } diff --git a/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt b/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt index 6160b00379ef..5b48c1ff628c 100644 --- a/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt +++ b/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt @@ -35,27 +35,21 @@ class ViewUtil @Inject constructor() { fun touchIsWithinView(view: View, x: Float, y: Float): Boolean { val left = view.locationOnScreen[0] val top = view.locationOnScreen[1] - return left <= x && - x <= left + view.width && - top <= y && - y <= top + view.height + return left <= x && x <= left + view.width && top <= y && y <= top + view.height } - /** - * Sets [outRect] to be the view's location within its window. - */ - fun setRectToViewWindowLocation(view: View, outRect: Rect) { - val locInWindow = IntArray(2) - view.getLocationInWindow(locInWindow) - - val x = locInWindow[0] - val y = locInWindow[1] - - outRect.set( - x, - y, - x + view.width, - y + view.height, - ) - } + /** Sets [outRect] to be the view's location within its window. */ + fun setRectToViewWindowLocation(view: View, outRect: Rect) = view.viewBoundsOnScreen(outRect) +} + +fun View.viewBoundsOnScreen(outRect: Rect) { + val locInWindow = IntArray(2) + getLocationInWindow(locInWindow) + + val x = locInWindow[0] + val y = locInWindow[1] + + outRect.set(x, y, x + width, y + height) } + +fun View.viewBoundsOnScreen(): Rect = Rect().also { viewBoundsOnScreen(it) } diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt index 9eee91beda51..f04fb2c3b8d5 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt @@ -30,7 +30,6 @@ import androidx.dynamicanimation.animation.FloatValueHolder import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce import com.android.internal.R as internalR -import com.android.settingslib.Utils import com.android.systemui.res.R import com.android.systemui.util.children import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope @@ -294,15 +293,11 @@ constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) { } if (isSelected && !isAnimated) { setBackgroundResource(R.drawable.volume_drawer_selection_bg) - setColorFilter( - Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnPrimary) - ) + setColorFilter(context.getColor(internalR.color.materialColorOnPrimary)) background = background.mutate() } else if (!isAnimated) { setBackgroundResource(R.drawable.volume_ringer_item_bg) - setColorFilter( - Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnSurface) - ) + setColorFilter(context.getColor(internalR.color.materialColorOnSurface)) background = background.mutate() } setOnClickListener { diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt index 3c465674ebb5..832f1c3471d6 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt @@ -31,30 +31,20 @@ data class RingerButtonUiModel( companion object { fun getUnselectedButton(context: Context): RingerButtonUiModel { return RingerButtonUiModel( - tintColor = - Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnSurface), - backgroundColor = - Utils.getColorAttrDefaultColor( - context, - internalR.attr.materialColorSurfaceContainerHighest, - ), - cornerRadius = - context.resources.getDimensionPixelSize( - R.dimen.volume_dialog_background_square_corner_radius - ), + tintColor = context.getColor(internalR.color.materialColorOnSurface), + backgroundColor = context.getColor( + internalR.color.materialColorSurfaceContainerHighest), + cornerRadius = context.resources.getDimensionPixelSize( + R.dimen.volume_dialog_background_square_corner_radius), ) } fun getSelectedButton(context: Context): RingerButtonUiModel { return RingerButtonUiModel( - tintColor = - Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnPrimary), - backgroundColor = - Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorPrimary), - cornerRadius = - context.resources.getDimensionPixelSize( - R.dimen.volume_dialog_ringer_selected_button_background_radius - ), + tintColor = context.getColor(internalR.color.materialColorOnPrimary), + backgroundColor = context.getColor(internalR.color.materialColorPrimary), + cornerRadius = context.resources.getDimensionPixelSize( + R.dimen.volume_dialog_ringer_selected_button_background_radius), ) } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt index 02747d7e6996..6c4a853b42ad 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt @@ -80,10 +80,10 @@ constructor( label = label, labelColor = if (Flags.volumeRedesign()) { - Color.Attribute(com.android.internal.R.attr.materialColorOnSurface) + Color.Resource(com.android.internal.R.color.materialColorOnSurface) } else { - Color.Attribute( - com.android.internal.R.attr.materialColorOnSurfaceVariant + Color.Resource( + com.android.internal.R.color.materialColorOnSurfaceVariant ) }, deviceName = @@ -96,10 +96,10 @@ constructor( }, deviceNameColor = if (mediaOutputModel.canOpenAudioSwitcher) { - Color.Attribute(com.android.internal.R.attr.materialColorOnSurface) + Color.Resource(com.android.internal.R.color.materialColorOnSurface) } else { - Color.Attribute( - com.android.internal.R.attr.materialColorOnSurfaceVariant + Color.Resource( + com.android.internal.R.color.materialColorOnSurfaceVariant ) }, ) @@ -126,32 +126,32 @@ constructor( iconColor = if (mediaOutputModel.canOpenAudioSwitcher) { if (Flags.volumeRedesign()) { - Color.Attribute( - com.android.internal.R.attr.materialColorOnPrimary + Color.Resource( + com.android.internal.R.color.materialColorOnPrimary ) } else { - Color.Attribute( - com.android.internal.R.attr.materialColorSurface + Color.Resource( + com.android.internal.R.color.materialColorSurface ) } } else { - Color.Attribute( - com.android.internal.R.attr.materialColorSurfaceContainerHighest + Color.Resource( + com.android.internal.R.color.materialColorSurfaceContainerHighest ) }, backgroundColor = if (mediaOutputModel.canOpenAudioSwitcher) { if (Flags.volumeRedesign()) { - Color.Attribute( - com.android.internal.R.attr.materialColorPrimary + Color.Resource( + com.android.internal.R.color.materialColorPrimary ) } else { - Color.Attribute( - com.android.internal.R.attr.materialColorSecondary + Color.Resource( + com.android.internal.R.color.materialColorSecondary ) } } else { - Color.Attribute(com.android.internal.R.attr.materialColorOutline) + Color.Resource(com.android.internal.R.color.materialColorOutline) }, ) } else { @@ -160,16 +160,16 @@ constructor( iconColor = if (mediaOutputModel.canOpenAudioSwitcher) { if (Flags.volumeRedesign()) { - Color.Attribute( - com.android.internal.R.attr.materialColorPrimary + Color.Resource( + com.android.internal.R.color.materialColorPrimary ) } else { - Color.Attribute( - com.android.internal.R.attr.materialColorOnSurfaceVariant + Color.Resource( + com.android.internal.R.color.materialColorOnSurfaceVariant ) } } else { - Color.Attribute(com.android.internal.R.attr.materialColorOutline) + Color.Resource(com.android.internal.R.color.materialColorOutline) }, backgroundColor = Color.Loaded(GraphicsColor.TRANSPARENT), ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java index 50d0049dbcd7..dddaabb66022 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java @@ -26,10 +26,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import android.graphics.PointF; + import android.testing.TestableLooper; import android.view.View; import android.view.ViewPropertyAnimator; import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager; import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.FlingAnimation; @@ -49,6 +51,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -69,13 +72,17 @@ public class MenuAnimationControllerTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); + @Mock + private AccessibilityManager mAccessibilityManager; + @Before public void setUp() throws Exception { final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager); final SecureSettings secureSettings = TestUtils.mockSecureSettings(); - final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, secureSettings); + final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, + secureSettings); mMenuView = spy(new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance, secureSettings)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java index f4580c173579..400b3b388c31 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java @@ -159,7 +159,8 @@ public class MenuViewLayerTest extends SysuiTestCase { new WindowMetrics(mDisplayBounds, fakeDisplayInsets(), /* density = */ 0.0f)); doReturn(mWindowMetrics).when(mStubWindowManager).getCurrentWindowMetrics(); - mMenuViewModel = new MenuViewModel(mSpyContext, mSecureSettings); + mMenuViewModel = new MenuViewModel( + mSpyContext, mStubAccessibilityManager, mSecureSettings); MenuViewAppearance menuViewAppearance = new MenuViewAppearance( mSpyContext, mStubWindowManager); mMenuView = spy( diff --git a/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt index d3409c7256fd..e3aeaa85873d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt @@ -484,14 +484,12 @@ class RepeatWhenAttachedTest : SysuiTestCase() { private fun CoroutineScope.repeatWhenAttached(): DisposableHandle { return view.repeatWhenAttached( coroutineContext = coroutineContext, - block = block, + block = { block.invoke(this) }, ) } - private class Block : suspend LifecycleOwner.(View) -> Unit { - data class Invocation( - val lifecycleOwner: LifecycleOwner, - ) { + private class Block { + data class Invocation(val lifecycleOwner: LifecycleOwner) { val lifecycleState: Lifecycle.State get() = lifecycleOwner.lifecycle.currentState } @@ -504,7 +502,7 @@ class RepeatWhenAttachedTest : SysuiTestCase() { val latestLifecycleState: Lifecycle.State get() = _invocations.last().lifecycleState - override suspend fun invoke(lifecycleOwner: LifecycleOwner, view: View) { + fun invoke(lifecycleOwner: LifecycleOwner) { _invocations.add(Invocation(lifecycleOwner)) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt index 4da7b2ac3700..e035a02ecf00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt @@ -64,9 +64,11 @@ public class SeekBarViewModelTest : SysuiTestCase() { override fun executeOnDiskIO(runnable: Runnable) { runnable.run() } + override fun postToMainThread(runnable: Runnable) { runnable.run() } + override fun isMainThread(): Boolean { return true } @@ -805,4 +807,32 @@ public class SeekBarViewModelTest : SysuiTestCase() { fakeExecutor.runAllReady() verify(mockController).unregisterCallback(any()) } + + @Test + fun positionUpdatedWhileStopped() { + // When playback is stopped at one position + val firstPosition = 200L + val state = + PlaybackState.Builder().run { + setState(PlaybackState.STATE_STOPPED, firstPosition, 1f) + build() + } + whenever(mockController.playbackState).thenReturn(state) + val captor = ArgumentCaptor.forClass(MediaController.Callback::class.java) + viewModel.updateController(mockController) + verify(mockController).registerCallback(captor.capture()) + assertThat(viewModel.progress.value!!.elapsedTime).isEqualTo(firstPosition.toInt()) + + // And the state is updated with a new position + val secondPosition = 42L + val secondState = + PlaybackState.Builder().run { + setState(PlaybackState.STATE_STOPPED, secondPosition, 1f) + build() + } + captor.value.onPlaybackStateChanged(secondState) + + // THEN then elapsed time should be updated + assertThat(viewModel.progress.value!!.elapsedTime).isEqualTo(secondPosition.toInt()) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt index d2317e4f533d..fc720b836f72 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt @@ -87,7 +87,7 @@ class DragAndDropTest : SysuiTestCase() { } composeRule.waitForIdle() - listState.onStarted(TestEditTiles[0]) + listState.onStarted(TestEditTiles[0], DragType.Add) // Tile is being dragged, it should be replaced with a placeholder composeRule.onNodeWithContentDescription("tileA").assertDoesNotExist() @@ -113,8 +113,8 @@ class DragAndDropTest : SysuiTestCase() { } composeRule.waitForIdle() - listState.onStarted(TestEditTiles[0]) - listState.onMoved(1, false) + listState.onStarted(TestEditTiles[0], DragType.Add) + listState.onTargeting(1, false) listState.onDrop() // Available tiles should re-appear @@ -140,7 +140,7 @@ class DragAndDropTest : SysuiTestCase() { } composeRule.waitForIdle() - listState.onStarted(TestEditTiles[0]) + listState.onStarted(TestEditTiles[0], DragType.Add) listState.movedOutOfBounds() listState.onDrop() @@ -165,11 +165,11 @@ class DragAndDropTest : SysuiTestCase() { } composeRule.waitForIdle() - listState.onStarted(createEditTile("newTile")) + listState.onStarted(createEditTile("newTile"), DragType.Add) // Insert after tileD, which is at index 4 // [ a ] [ b ] [ c ] [ empty ] // [ tile d ] [ e ] - listState.onMoved(4, insertAfter = true) + listState.onTargeting(4, insertAfter = true) listState.onDrop() // Available tiles should re-appear diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateTest.java index 7b24233d8603..300c9b843d1c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateTest.java @@ -6,6 +6,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -23,8 +24,8 @@ import android.widget.LinearLayout; import android.widget.Switch; import android.widget.TextView; -import androidx.test.annotation.UiThreadTest; import androidx.recyclerview.widget.RecyclerView; +import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; @@ -40,8 +41,6 @@ import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; import com.android.wifitrackerlib.WifiEntry; -import kotlinx.coroutines.CoroutineScope; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -52,6 +51,8 @@ import org.mockito.MockitoSession; import java.util.List; +import kotlinx.coroutines.CoroutineScope; + @SmallTest @RunWith(AndroidJUnit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @@ -127,7 +128,7 @@ public class InternetDialogDelegateTest extends SysuiTestCase { .spyStatic(WifiEnterpriseRestrictionUtils.class) .startMocking(); when(WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(mContext)).thenReturn(true); - when(mSystemUIDialogFactory.create(any(SystemUIDialog.Delegate.class))) + when(mSystemUIDialogFactory.create(any(SystemUIDialog.Delegate.class), eq(mContext))) .thenReturn(mSystemUIDialog); when(mSystemUIDialog.getContext()).thenReturn(mContext); when(mSystemUIDialog.getWindow()).thenReturn(mWindow); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java index 63e56eeb730f..8045a13ff9be 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.when; import android.graphics.drawable.Icon; import android.os.Handler; -import android.platform.test.annotations.EnableFlags; import android.view.KeyboardShortcutGroup; import android.view.KeyboardShortcutInfo; import android.view.WindowManager; @@ -34,7 +33,6 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.google.android.material.bottomsheet.BottomSheetDialog; @@ -95,7 +93,6 @@ public class KeyboardShortcutListSearchTest extends SysuiTestCase { } @Test - @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI) public void requestAppKeyboardShortcuts_callback_sanitisesIcons() { KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests(); @@ -114,7 +111,6 @@ public class KeyboardShortcutListSearchTest extends SysuiTestCase { } @Test - @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI) public void requestImeKeyboardShortcuts_callback_sanitisesIcons() { KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java index 105cf168995c..20ecaf75c625 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java @@ -31,7 +31,6 @@ import android.annotation.Nullable; import android.app.Dialog; import android.graphics.drawable.Icon; import android.os.Handler; -import android.platform.test.annotations.EnableFlags; import android.view.KeyboardShortcutGroup; import android.view.KeyboardShortcutInfo; import android.view.WindowManager; @@ -39,7 +38,6 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import org.junit.Before; @@ -131,7 +129,6 @@ public class KeyboardShortcutsTest extends SysuiTestCase { } @Test - @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI) public void requestAppKeyboardShortcuts_callback_sanitisesIcons() { KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests(); KeyboardShortcuts.toggle(mContext, DEVICE_ID); @@ -143,7 +140,6 @@ public class KeyboardShortcutsTest extends SysuiTestCase { } @Test - @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI) public void requestImeKeyboardShortcuts_callback_sanitisesIcons() { KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests(); KeyboardShortcuts.toggle(mContext, DEVICE_ID); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 11b19f95c1c0..99467cb11282 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -1275,6 +1275,37 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { } @Test + @EnableSceneContainer + public void testChildHeightUpdated_whenMaxDisplayedNotificationsSet_updatesStackHeight() { + ExpandableNotificationRow row = mock(ExpandableNotificationRow.class); + int maxNotifs = 1; // any non-zero limit + float stackTop = 100; + float stackCutoff = 1100; + mStackScroller.setStackTop(stackTop); + mStackScroller.setStackCutoff(stackCutoff); + + // Given we have a limit on max displayed notifications + int stackHeightBeforeUpdate = 100; + when(mStackSizeCalculator.computeHeight(eq(mStackScroller), eq(maxNotifs), anyFloat())) + .thenReturn((float) stackHeightBeforeUpdate); + mStackScroller.setMaxDisplayedNotifications(maxNotifs); + + // And the stack heights are set + assertThat(mStackScroller.getIntrinsicStackHeight()).isEqualTo(stackHeightBeforeUpdate); + assertThat(mAmbientState.getStackEndHeight()).isEqualTo(stackHeightBeforeUpdate); + + // When a child changes its height + int stackHeightAfterUpdate = 300; + when(mStackSizeCalculator.computeHeight(eq(mStackScroller), eq(maxNotifs), anyFloat())) + .thenReturn((float) stackHeightAfterUpdate); + mStackScroller.onChildHeightChanged(row, /* needsAnimation = */ false); + + // Then the stack heights are updated + assertThat(mStackScroller.getIntrinsicStackHeight()).isEqualTo(stackHeightAfterUpdate); + assertThat(mAmbientState.getStackEndHeight()).isEqualTo(stackHeightAfterUpdate); + } + + @Test @DisableSceneContainer public void testSetMaxDisplayedNotifications_notifiesListeners() { ExpandableView.OnHeightChangedListener listener = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt index abdd79761ce0..0ba0aeb87225 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt @@ -45,6 +45,7 @@ import com.android.systemui.shade.ShadeControllerImpl import com.android.systemui.shade.ShadeLogger import com.android.systemui.shade.ShadeViewController import com.android.systemui.shade.StatusBarLongPressGestureDetector +import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository import com.android.systemui.shade.display.StatusBarTouchShadeDisplayPolicy import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor import com.android.systemui.statusbar.CommandQueue @@ -77,6 +78,7 @@ import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations +import org.mockito.kotlin.verifyNoMoreInteractions @SmallTest @RunWith(AndroidJUnit4::class) @@ -86,6 +88,7 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { private val statusBarContentInsetsProvider = statusBarContentInsetsProviderStore.defaultDisplay private val fakeDarkIconDispatcher = kosmos.fakeDarkIconDispatcher + private val fakeShadeDisplaysRepository = kosmos.fakeShadeDisplaysRepository @Mock private lateinit var shadeViewController: ShadeViewController @Mock private lateinit var panelExpansionInteractor: PanelExpansionInteractor @Mock private lateinit var featureFlags: FeatureFlags @@ -260,6 +263,64 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { } @Test + @DisableFlags(AconfigFlags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS) + fun handleTouchEventFromStatusBar_statusBarConnectedDisplaysDisabled_viewReceivesEvent() { + `when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true) + `when`(shadeViewController.isViewEnabled).thenReturn(true) + fakeShadeDisplaysRepository.setDisplayId(SECONDARY_DISPLAY_ID) + val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 2f, 0) + + view.onTouchEvent(event) + + verify(shadeViewController).handleExternalTouch(event) + } + + @Test + @EnableFlags( + AconfigFlags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS, + AconfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND, + ) + fun handleTouchEventFromStatusBar_statusBarConnectedDisplaysEnabled_shadeWindowGoesAroundEnabled_viewReceivesEvent() { + `when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true) + `when`(shadeViewController.isViewEnabled).thenReturn(true) + fakeShadeDisplaysRepository.setDisplayId(SECONDARY_DISPLAY_ID) + val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 2f, 0) + + view.onTouchEvent(event) + + verify(shadeViewController).handleExternalTouch(event) + } + + @Test + @EnableFlags(AconfigFlags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS) + @DisableFlags(AconfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND) + fun handleTouchEventFromStatusBar_touchOnShadeDisplay_statusBarConnectedDisplaysEnabled_shadeWindowGoesAroundDisabled_viewReceivesEvent() { + `when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true) + `when`(shadeViewController.isViewEnabled).thenReturn(true) + fakeShadeDisplaysRepository.setDisplayId(DISPLAY_ID) + val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 2f, 0) + + view.onTouchEvent(event) + + verify(shadeViewController).handleExternalTouch(event) + } + + @Test + @EnableFlags(AconfigFlags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS) + @DisableFlags(AconfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND) + fun handleTouchEventFromStatusBar_touchNotOnShadeDisplay_statusBarConnectedDisplaysEnabled_shadeWindowGoesAroundDisabled_viewDoesNotReceiveEvent() { + `when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true) + `when`(shadeViewController.isViewEnabled).thenReturn(true) + fakeShadeDisplaysRepository.setDisplayId(SECONDARY_DISPLAY_ID) + val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 2f, 0) + + view.onTouchEvent(event) + + verify(shadeViewController).isViewEnabled + verifyNoMoreInteractions(shadeViewController) + } + + @Test @DisableFlags(com.android.systemui.Flags.FLAG_STATUS_BAR_SWIPE_OVER_CHIP) fun handleInterceptTouchEventFromStatusBar_shadeReturnsFalse_flagOff_viewReturnsFalse() { `when`(shadeViewController.handleExternalInterceptTouch(any())).thenReturn(false) @@ -432,6 +493,7 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { fakeDarkIconDispatcher, statusBarContentInsetsProviderStore, Lazy { statusBarTouchShadeDisplayPolicy }, + fakeShadeDisplaysRepository, ) .create(view) .also { it.init() } @@ -445,6 +507,7 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { } private companion object { - const val DISPLAY_ID = 1 + const val DISPLAY_ID = 0 + const val SECONDARY_DISPLAY_ID = 2 } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 33a4b7ef3ed6..38ddb3e426fa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -45,8 +45,6 @@ import static org.mockito.Mockito.when; import android.animation.Animator; import android.content.Context; -import android.content.res.ColorStateList; -import android.content.res.TypedArray; import android.graphics.Color; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; @@ -154,7 +152,6 @@ public class ScrimControllerTest extends SysuiTestCase { private final FakeKeyguardTransitionRepository mKeyguardTransitionRepository = mKosmos.getKeyguardTransitionRepository(); @Mock private KeyguardInteractor mKeyguardInteractor; - @Mock private TypedArray mMockTypedArray; // TODO(b/204991468): Use a real PanelExpansionStateManager object once this bug is fixed. (The // event-dispatch-on-registration pattern caused some of these unit tests to fail.) @@ -236,12 +233,8 @@ public class ScrimControllerTest extends SysuiTestCase { public void setup() { MockitoAnnotations.initMocks(this); mContext = spy(getContext()); - when(mContext.obtainStyledAttributes( - new int[]{com.android.internal.R.attr.materialColorSurface})) - .thenReturn(mMockTypedArray); - - when(mMockTypedArray.getColorStateList(anyInt())) - .thenAnswer((invocation) -> ColorStateList.valueOf(mSurfaceColor)); + when(mContext.getColor(com.android.internal.R.color.materialColorSurface)) + .thenAnswer(invocation -> mSurfaceColor); mScrimBehind = spy(new ScrimView(mContext)); mScrimInFront = new ScrimView(mContext); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 3e24fbe6cd8d..b39e38bd71cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -533,7 +533,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { CollapsedStatusBarFragment fragment = resumeAndGetFragment(); when(mOngoingCallController.hasOngoingCall()).thenReturn(true); - when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(true); + when(mHeadsUpAppearanceController.shouldHeadsUpStatusBarBeVisible()).thenReturn(true); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); @@ -775,7 +775,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { /* hasPrimaryOngoingActivity= */ true, /* hasSecondaryOngoingActivity= */ false, /* shouldAnimate= */ false); - when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(true); + when(mHeadsUpAppearanceController.shouldHeadsUpStatusBarBeVisible()).thenReturn(true); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); @@ -792,7 +792,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { /* hasPrimaryOngoingActivity= */ true, /* hasSecondaryOngoingActivity= */ true, /* shouldAnimate= */ false); - when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(true); + when(mHeadsUpAppearanceController.shouldHeadsUpStatusBarBeVisible()).thenReturn(true); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); @@ -1091,9 +1091,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { @Test @DisableFlags({StatusBarRootModernization.FLAG_NAME, StatusBarChipsModernization.FLAG_NAME}) - public void disable_headsUpShouldBeVisibleTrue_clockDisabled() { + public void disable_shouldHeadsUpStatusBarBeVisibleTrue_clockDisabled() { CollapsedStatusBarFragment fragment = resumeAndGetFragment(); - when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(true); + when(mHeadsUpAppearanceController.shouldHeadsUpStatusBarBeVisible()).thenReturn(true); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); @@ -1102,9 +1102,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { @Test @DisableFlags({StatusBarRootModernization.FLAG_NAME, StatusBarChipsModernization.FLAG_NAME}) - public void disable_headsUpShouldBeVisibleFalse_clockNotDisabled() { + public void disable_shouldHeadsUpStatusBarBeVisibleFalse_clockNotDisabled() { CollapsedStatusBarFragment fragment = resumeAndGetFragment(); - when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(false); + when(mHeadsUpAppearanceController.shouldHeadsUpStatusBarBeVisible()).thenReturn(false); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DozeInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DozeInteractorKosmos.kt index 3304d44db9b1..10ca84f579d1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DozeInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DozeInteractorKosmos.kt @@ -19,11 +19,9 @@ package com.android.systemui.keyguard.domain.interactor import com.android.systemui.keyguard.data.repository.keyguardRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.power.data.repository.powerRepository import com.android.systemui.scene.domain.interactor.sceneInteractor val Kosmos.dozeInteractor: DozeInteractor by Fixture { - DozeInteractor( - keyguardRepository, - { sceneInteractor }, - ) + DozeInteractor(keyguardRepository, powerRepository, { sceneInteractor }) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt index 7ee9d84d84fb..d941fb049835 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt @@ -54,7 +54,7 @@ var Kosmos.brightnessWarningToast: BrightnessWarningToast by * that kosmos instance */ fun Kosmos.runTest(testBody: suspend Kosmos.() -> Unit) = - testScope.runTest { this@runTest.testBody() } + testScope.runTest testBody@{ this@runTest.testBody() } fun Kosmos.runCurrent() = testScope.runCurrent() diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/ActivityStarterKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/ActivityStarterKosmos.kt index 0ec8d49ec29b..49bbbef6ccc0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/ActivityStarterKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/ActivityStarterKosmos.kt @@ -17,6 +17,6 @@ package com.android.systemui.plugins import com.android.systemui.kosmos.Kosmos -import com.android.systemui.util.mockito.mock +import org.mockito.kotlin.mock var Kosmos.activityStarter by Kosmos.Fixture { mock<ActivityStarter>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt index ace650020a9d..9dfbcfbbc407 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt @@ -19,6 +19,7 @@ package com.android.systemui.power.data.repository import android.os.PowerManager import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.power.shared.model.DozeScreenStateModel import com.android.systemui.power.shared.model.ScreenPowerState import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.power.shared.model.WakefulnessModel @@ -41,6 +42,8 @@ class FakePowerRepository @Inject constructor() : PowerRepository { private val _screenPowerState = MutableStateFlow(ScreenPowerState.SCREEN_OFF) override val screenPowerState = _screenPowerState.asStateFlow() + override val dozeScreenState = MutableStateFlow(DozeScreenStateModel.UNKNOWN) + var lastWakeWhy: String? = null var lastWakeReason: Int? = null @@ -63,7 +66,7 @@ class FakePowerRepository @Inject constructor() : PowerRepository { rawState: WakefulnessState, lastWakeReason: WakeSleepReason, lastSleepReason: WakeSleepReason, - powerButtonLaunchGestureTriggered: Boolean + powerButtonLaunchGestureTriggered: Boolean, ) { _wakefulness.value = WakefulnessModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt index d71bc310b0ed..49957f0b43cc 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt @@ -18,6 +18,7 @@ package com.android.systemui.qs.composefragment.viewmodel import android.content.res.mainResources import androidx.lifecycle.LifecycleCoroutineScope +import com.android.internal.logging.uiEventLoggerFake import com.android.systemui.classifier.domain.interactor.falsingInteractor import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor @@ -68,6 +69,7 @@ val Kosmos.qsFragmentComposeViewModelFactory by qqsMediaHost, qsMediaHost, usingMediaInComposeFragment, + uiEventLoggerFake, lifecycleScope, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt index 86c3add09577..71408f6adffd 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt @@ -17,9 +17,11 @@ package com.android.systemui.qs.panels.ui.viewmodel import android.content.applicationContext +import com.android.internal.logging.uiEventLoggerFake import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.kosmos.testDispatcher import com.android.systemui.qs.panels.domain.interactor.editTilesListInteractor import com.android.systemui.qs.panels.domain.interactor.gridLayoutMap import com.android.systemui.qs.panels.domain.interactor.gridLayoutTypeInteractor @@ -35,10 +37,12 @@ val Kosmos.editModeViewModel by currentTilesInteractor, tilesAvailabilityInteractor, minimumTilesInteractor, + uiEventLoggerFake, configurationInteractor, applicationContext, infiniteGridLayout, applicationCoroutineScope, + testDispatcher, gridLayoutTypeInteractor, gridLayoutMap, ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt index db4df38e038a..f2af619a4ad7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt @@ -17,25 +17,24 @@ package com.android.systemui.shade.domain.interactor import android.content.mockedContext -import android.view.mockWindowManager +import android.window.WindowContext import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.scene.ui.view.mockShadeRootView import com.android.systemui.shade.ShadeWindowLayoutParams import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository import java.util.Optional +import org.mockito.kotlin.mock -val Kosmos.shadeLayoutParams by Kosmos.Fixture { - ShadeWindowLayoutParams.create(mockedContext) -} +val Kosmos.shadeLayoutParams by Kosmos.Fixture { ShadeWindowLayoutParams.create(mockedContext) } + +val Kosmos.mockedWindowContext by Kosmos.Fixture { mock<WindowContext>() } val Kosmos.shadeDisplaysInteractor by Kosmos.Fixture { ShadeDisplaysInteractor( Optional.of(mockShadeRootView), fakeShadeDisplaysRepository, - mockedContext, - shadeLayoutParams, - mockWindowManager, + mockedWindowContext, testScope.backgroundScope, testScope.backgroundScope.coroutineContext, ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeKeyguardTransitionControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeKeyguardTransitionControllerKosmos.kt index e5a75d59468d..8865573c4030 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeKeyguardTransitionControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeKeyguardTransitionControllerKosmos.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,14 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.util.mockito.mock +import org.mockito.kotlin.mock + +var Kosmos.lockscreenShadeKeyguardTransitionController by Fixture { + mock<LockscreenShadeKeyguardTransitionController>() +} var Kosmos.lockscreenShadeKeyguardTransitionControllerFactory by Fixture { - mock<LockscreenShadeKeyguardTransitionController.Factory>() + LockscreenShadeKeyguardTransitionController.Factory { + lockscreenShadeKeyguardTransitionController + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerKosmos.kt index 27679804d11f..fc52e454a1c6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerKosmos.kt @@ -18,8 +18,12 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.util.mockito.mock +import org.mockito.kotlin.mock + +var Kosmos.lockscreenShadeQsTransitionController by Fixture { + mock<LockscreenShadeQsTransitionController>() +} var Kosmos.lockscreenShadeQsTransitionControllerFactory by Fixture { - mock<LockscreenShadeQsTransitionController.Factory>() + LockscreenShadeQsTransitionController.Factory { lockscreenShadeQsTransitionController } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScrollerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScrollerKosmos.kt index 43e39c05f6e9..5523bd68f692 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScrollerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScrollerKosmos.kt @@ -18,8 +18,12 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.util.mockito.mock +import org.mockito.kotlin.mock + +var Kosmos.singleShadeLockScreenOverScroller by Fixture { + mock<SingleShadeLockScreenOverScroller>() +} var Kosmos.singleShadeLockScreenOverScrollerFactory by Fixture { - mock<SingleShadeLockScreenOverScroller.Factory>() + SingleShadeLockScreenOverScroller.Factory { _ -> singleShadeLockScreenOverScroller } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerKosmos.kt index 017371a6cba8..e491dffb0ed5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerKosmos.kt @@ -18,8 +18,10 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.util.mockito.mock +import org.mockito.kotlin.mock + +var Kosmos.splitShadeLockScreenOverScroller by Fixture { mock<SplitShadeLockScreenOverScroller>() } var Kosmos.splitShadeLockScreenOverScrollerFactory by Fixture { - mock<SplitShadeLockScreenOverScroller.Factory>() + SplitShadeLockScreenOverScroller.Factory { _, _ -> splitShadeLockScreenOverScroller } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelKosmos.kt index 4bcce8601d64..d0c80c7332b3 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelKosmos.kt @@ -19,8 +19,13 @@ package com.android.systemui.statusbar.chips.notification.ui.viewmodel import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.statusbar.chips.notification.domain.interactor.statusBarNotificationChipsInteractor +import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor val Kosmos.notifChipsViewModel: NotifChipsViewModel by Kosmos.Fixture { - NotifChipsViewModel(applicationCoroutineScope, statusBarNotificationChipsInteractor) + NotifChipsViewModel( + applicationCoroutineScope, + statusBarNotificationChipsInteractor, + headsUpNotificationInteractor, + ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt index 22f8767e1d55..3c2d004fcad7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt @@ -47,6 +47,7 @@ class FakeStatusBarModePerDisplayRepository : StatusBarModePerDisplayRepository override val isInFullscreenMode = MutableStateFlow(false) override val statusBarAppearance = MutableStateFlow<StatusBarAppearance?>(null) override val statusBarMode = MutableStateFlow(StatusBarMode.TRANSPARENT) + override val ongoingProcessRequiresStatusBarVisible = MutableStateFlow(false) override fun showTransient() { isTransientShown.value = true @@ -59,6 +60,9 @@ class FakeStatusBarModePerDisplayRepository : StatusBarModePerDisplayRepository override fun start() {} override fun stop() {} + override fun setOngoingProcessRequiresStatusBarVisible(requiredVisible: Boolean) { + ongoingProcessRequiresStatusBarVisible.value = requiredVisible + } override fun onStatusBarViewInitialized(component: HomeStatusBarComponent) {} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/VisualInterruptionDecisionProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/VisualInterruptionDecisionProviderKosmos.kt new file mode 100644 index 000000000000..360e9e93f18d --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/VisualInterruptionDecisionProviderKosmos.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider +import org.mockito.kotlin.mock + +val Kosmos.visualInterruptionDecisionProvider by + Kosmos.Fixture { mock<VisualInterruptionDecisionProvider>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/data/repository/FakeHeadsUpRowRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/data/repository/FakeHeadsUpRowRepository.kt index 7de22d8c8b43..4a692d2ca4d9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/data/repository/FakeHeadsUpRowRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/data/repository/FakeHeadsUpRowRepository.kt @@ -26,7 +26,8 @@ class FakeHeadsUpRowRepository(override val key: String, override val elementKey elementKey: Any = Any(), isPinned: Boolean, ) : this(key = key, elementKey = elementKey) { - this.pinnedStatus.value = if (isPinned) PinnedStatus.PinnedBySystem else PinnedStatus.NotPinned + this.pinnedStatus.value = + if (isPinned) PinnedStatus.PinnedBySystem else PinnedStatus.NotPinned } constructor( @@ -40,3 +41,10 @@ class FakeHeadsUpRowRepository(override val key: String, override val elementKey override val pinnedStatus: MutableStateFlow<PinnedStatus> = MutableStateFlow(PinnedStatus.NotPinned) } + +/** Use this fake if you're using [UnconfinedTestDispatcher]. See b/383528592 for reasoning. */ +class UnconfinedFakeHeadsUpRowRepository( + override val key: String, + override val elementKey: Any = Any(), + override val pinnedStatus: MutableStateFlow<PinnedStatus>, +) : HeadsUpRowRepository diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationAlertsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationAlertsInteractorKosmos.kt new file mode 100644 index 000000000000..768952d1ee77 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationAlertsInteractorKosmos.kt @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.domain.interactor + +import com.android.systemui.kosmos.Kosmos +import org.mockito.kotlin.mock + +val Kosmos.notificationAlertsInteractor by Kosmos.Fixture { mock<NotificationAlertsInteractor>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt index 51fb36fb2ead..9090e02b22b6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt @@ -20,7 +20,9 @@ import com.android.systemui.activity.data.repository.activityManagerRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.log.logcatLogBuffer +import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor +import com.android.systemui.statusbar.window.fakeStatusBarWindowControllerStore val Kosmos.ongoingCallInteractor: OngoingCallInteractor by Kosmos.Fixture { @@ -28,6 +30,8 @@ val Kosmos.ongoingCallInteractor: OngoingCallInteractor by scope = applicationCoroutineScope, activeNotificationsInteractor = activeNotificationsInteractor, activityManagerRepository = activityManagerRepository, + statusBarModeRepositoryStore = fakeStatusBarModeRepository, + statusBarWindowControllerStore = fakeStatusBarWindowControllerStore, logBuffer = logcatLogBuffer("OngoingCallInteractorKosmos"), ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/KeyguardStateControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/KeyguardStateControllerKosmos.kt index f19ac1e5a58d..26642d4f7534 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/KeyguardStateControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/KeyguardStateControllerKosmos.kt @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.policy import com.android.systemui.kosmos.Kosmos -import org.mockito.Mockito.mock +import org.mockito.kotlin.mock var Kosmos.keyguardStateController: KeyguardStateController by - Kosmos.Fixture { mock(KeyguardStateController::class.java) } + Kosmos.Fixture { mock<KeyguardStateController>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt index a110a49ccba8..09e6a0eaa301 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt @@ -20,6 +20,7 @@ import android.view.View import android.view.ViewGroup import com.android.systemui.animation.ActivityTransitionAnimator import com.android.systemui.fragments.FragmentHostManager +import kotlinx.coroutines.flow.MutableStateFlow import java.util.Optional class FakeStatusBarWindowController : StatusBarWindowController { @@ -30,6 +31,8 @@ class FakeStatusBarWindowController : StatusBarWindowController { var isStopped = false private set + val ongoingProcessRequiresStatusBarVisible = MutableStateFlow(false) + override val statusBarHeight: Int = 0 override fun refreshStatusBarHeight() {} @@ -57,5 +60,7 @@ class FakeStatusBarWindowController : StatusBarWindowController { override fun setForceStatusBarVisible(forceStatusBarVisible: Boolean) {} - override fun setOngoingProcessRequiresStatusBarVisible(visible: Boolean) {} + override fun setOngoingProcessRequiresStatusBarVisible(visible: Boolean) { + ongoingProcessRequiresStatusBarVisible.value = visible + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/touchpad/ui/gesture/FakeVelocityTracker.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/touchpad/ui/gesture/FakeVelocityTracker.kt index f12089a08488..e767b8775a42 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/touchpad/ui/gesture/FakeVelocityTracker.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/touchpad/ui/gesture/FakeVelocityTracker.kt @@ -20,9 +20,9 @@ import android.view.MotionEvent import com.android.systemui.touchpad.tutorial.ui.gesture.Velocity import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker -class FakeVelocityTracker : VelocityTracker { +class FakeVelocityTracker(velocity: Float = 0f) : VelocityTracker { - private var fakeVelocity = Velocity(0f) + private var fakeVelocity = Velocity(velocity) override fun calculateVelocity(): Velocity { return fakeVelocity diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt index 8bf3a43765ae..ae9b8c85910f 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt @@ -17,6 +17,7 @@ package com.android.systemui.kairos import com.android.systemui.kairos.util.These +import com.android.systemui.kairos.util.WithPrev import com.android.systemui.kairos.util.just import com.android.systemui.kairos.util.none import kotlinx.coroutines.flow.Flow @@ -27,15 +28,18 @@ import kotlinx.coroutines.flow.conflate * Returns a [TFlow] that emits the value sampled from the [Transactional] produced by each emission * of the original [TFlow], within the same transaction of the original emission. */ +@ExperimentalFrpApi fun <A> TFlow<Transactional<A>>.sampleTransactionals(): TFlow<A> = map { it.sample() } /** @see FrpTransactionScope.sample */ +@ExperimentalFrpApi fun <A, B, C> TFlow<A>.sample( state: TState<B>, transform: suspend FrpTransactionScope.(A, B) -> C, ): TFlow<C> = map { transform(it, state.sample()) } /** @see FrpTransactionScope.sample */ +@ExperimentalFrpApi fun <A, B, C> TFlow<A>.sample( transactional: Transactional<B>, transform: suspend FrpTransactionScope.(A, B) -> C, @@ -50,6 +54,7 @@ fun <A, B, C> TFlow<A>.sample( * * @see sample */ +@ExperimentalFrpApi fun <A, B, C> TFlow<A>.samplePromptly( state: TState<B>, transform: suspend FrpTransactionScope.(A, B) -> C, @@ -70,19 +75,10 @@ fun <A, B, C> TFlow<A>.samplePromptly( } /** - * Returns a [TState] containing a map with a snapshot of the current state of each [TState] in the - * original map. - */ -fun <K, A> Map<K, TState<A>>.combineValues(): TState<Map<K, A>> = - asIterable() - .map { (k, state) -> state.map { v -> k to v } } - .combine() - .map { entries -> entries.toMap() } - -/** * Returns a cold [Flow] that, when collected, emits from this [TFlow]. [network] is needed to * transactionally connect to / disconnect from the [TFlow] when collection starts/stops. */ +@ExperimentalFrpApi fun <A> TFlow<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate() @@ -90,6 +86,7 @@ fun <A> TFlow<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = * Returns a cold [Flow] that, when collected, emits from this [TState]. [network] is needed to * transactionally connect to / disconnect from the [TState] when collection starts/stops. */ +@ExperimentalFrpApi fun <A> TState<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate() @@ -99,6 +96,7 @@ fun <A> TState<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = * * When collection is cancelled, so is the [FrpSpec]. This means all ongoing work is cleaned up. */ +@ExperimentalFrpApi @JvmName("flowSpecToColdConflatedFlow") fun <A> FrpSpec<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate() @@ -109,6 +107,7 @@ fun <A> FrpSpec<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = * * When collection is cancelled, so is the [FrpSpec]. This means all ongoing work is cleaned up. */ +@ExperimentalFrpApi @JvmName("stateSpecToColdConflatedFlow") fun <A> FrpSpec<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate() @@ -117,6 +116,7 @@ fun <A> FrpSpec<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in * this [network], and then emits from the returned [TFlow]. */ +@ExperimentalFrpApi @JvmName("transactionalFlowToColdConflatedFlow") fun <A> Transactional<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate() @@ -125,6 +125,7 @@ fun <A> Transactional<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in * this [network], and then emits from the returned [TState]. */ +@ExperimentalFrpApi @JvmName("transactionalStateToColdConflatedFlow") fun <A> Transactional<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate() @@ -135,6 +136,7 @@ fun <A> Transactional<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow< * * When collection is cancelled, so is the [FrpStateful]. This means all ongoing work is cleaned up. */ +@ExperimentalFrpApi @JvmName("statefulFlowToColdConflatedFlow") fun <A> FrpStateful<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate() @@ -145,11 +147,13 @@ fun <A> FrpStateful<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> * * When collection is cancelled, so is the [FrpStateful]. This means all ongoing work is cleaned up. */ +@ExperimentalFrpApi @JvmName("statefulStateToColdConflatedFlow") fun <A> FrpStateful<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> = channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate() /** Return a [TFlow] that emits from the original [TFlow] only when [state] is `true`. */ +@ExperimentalFrpApi fun <A> TFlow<A>.filter(state: TState<Boolean>): TFlow<A> = filter { state.sample() } private fun Iterable<Boolean>.allTrue() = all { it } @@ -157,13 +161,15 @@ private fun Iterable<Boolean>.allTrue() = all { it } private fun Iterable<Boolean>.anyTrue() = any { it } /** Returns a [TState] that is `true` only when all of [states] are `true`. */ +@ExperimentalFrpApi fun allOf(vararg states: TState<Boolean>): TState<Boolean> = combine(*states) { it.allTrue() } /** Returns a [TState] that is `true` when any of [states] are `true`. */ +@ExperimentalFrpApi fun anyOf(vararg states: TState<Boolean>): TState<Boolean> = combine(*states) { it.anyTrue() } /** Returns a [TState] containing the inverse of the Boolean held by the original [TState]. */ -fun not(state: TState<Boolean>): TState<Boolean> = state.mapCheapUnsafe { !it } +@ExperimentalFrpApi fun not(state: TState<Boolean>): TState<Boolean> = state.mapCheapUnsafe { !it } /** * Represents a modal FRP sub-network. @@ -177,6 +183,7 @@ fun not(state: TState<Boolean>): TState<Boolean> = state.mapCheapUnsafe { !it } * * @see FrpStatefulMode */ +@ExperimentalFrpApi fun interface FrpBuildMode<out A> { /** * Invoked when this mode is enabled. Returns a value and a [TFlow] that signals a switch to a @@ -192,6 +199,7 @@ fun interface FrpBuildMode<out A> { * * @see FrpBuildMode */ +@ExperimentalFrpApi val <A> FrpBuildMode<A>.compiledFrpSpec: FrpSpec<TState<A>> get() = frpSpec { var modeChangeEvents by TFlowLoop<FrpBuildMode<A>>() @@ -215,6 +223,7 @@ val <A> FrpBuildMode<A>.compiledFrpSpec: FrpSpec<TState<A>> * * @see FrpBuildMode */ +@ExperimentalFrpApi fun interface FrpStatefulMode<out A> { /** * Invoked when this mode is enabled. Returns a value and a [TFlow] that signals a switch to a @@ -230,6 +239,7 @@ fun interface FrpStatefulMode<out A> { * * @see FrpBuildMode */ +@ExperimentalFrpApi val <A> FrpStatefulMode<A>.compiledStateful: FrpStateful<TState<A>> get() = statefully { var modeChangeEvents by TFlowLoop<FrpStatefulMode<A>>() @@ -246,5 +256,18 @@ val <A> FrpStatefulMode<A>.compiledStateful: FrpStateful<TState<A>> * Runs [spec] in this [FrpBuildScope], and then re-runs it whenever [rebuildSignal] emits. Returns * a [TState] that holds the result of the currently-active [FrpSpec]. */ +@ExperimentalFrpApi fun <A> FrpBuildScope.rebuildOn(rebuildSignal: TFlow<*>, spec: FrpSpec<A>): TState<A> = rebuildSignal.map { spec }.holdLatestSpec(spec) + +/** + * Like [stateChanges] but also includes the old value of this [TState]. + * + * Shorthand for: + * ``` kotlin + * stateChanges.map { WithPrev(previousValue = sample(), newValue = it) } + * ``` + */ +@ExperimentalFrpApi +val <A> TState<A>.transitions: TFlow<WithPrev<A, A>> + get() = stateChanges.map { WithPrev(previousValue = sample(), newValue = it) } diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt index 4de6deb3dc53..209a402bd629 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt @@ -38,6 +38,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.dropWhile +import kotlinx.coroutines.flow.scan import kotlinx.coroutines.launch /** A function that modifies the FrpNetwork. */ @@ -596,6 +597,26 @@ interface FrpBuildScope : FrpStateScope { fun <A> Flow<A>.toTState(initialValue: A): TState<A> = toTFlow().hold(initialValue) /** + * Shorthand for: + * ```kotlin + * flow.scan(initialValue, operation).toTFlow().hold(initialValue) + * ``` + */ + @ExperimentalFrpApi + fun <A, B> Flow<A>.scanToTState(initialValue: B, operation: (B, A) -> B): TState<B> = + scan(initialValue, operation).toTFlow().hold(initialValue) + + /** + * Shorthand for: + * ```kotlin + * flow.scan(initialValue) { a, f -> f(a) }.toTFlow().hold(initialValue) + * ``` + */ + @ExperimentalFrpApi + fun <A> Flow<(A) -> A>.scanToTState(initialValue: A): TState<A> = + scanToTState(initialValue) { a, f -> f(a) } + + /** * Invokes [block] whenever this [TFlow] emits a value. [block] receives an [FrpBuildScope] that * can be used to make further modifications to the FRP network, and/or perform side-effects via * [effect]. diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt index be2eb4312476..b39dcc131b1d 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt @@ -22,16 +22,17 @@ import kotlinx.coroutines.CoroutineScope /** * Scope for external side-effects triggered by the Frp network. This still occurs within the * context of a transaction, so general suspending calls are disallowed to prevent blocking the - * transaction. You can use [frpCoroutineScope] to [launch] new coroutines to perform long-running - * asynchronous work. This scope is alive for the duration of the containing [FrpBuildScope] that - * this side-effect scope is running in. + * transaction. You can use [frpCoroutineScope] to [launch][kotlinx.coroutines.launch] new + * coroutines to perform long-running asynchronous work. This scope is alive for the duration of the + * containing [FrpBuildScope] that this side-effect scope is running in. */ @RestrictsSuspension @ExperimentalFrpApi interface FrpEffectScope : FrpTransactionScope { /** * A [CoroutineScope] whose lifecycle lives for as long as this [FrpEffectScope] is alive. This - * is generally until the [Job] returned by [FrpBuildScope.effect] is cancelled. + * is generally until the [Job][kotlinx.coroutines.Job] returned by [FrpBuildScope.effect] is + * cancelled. */ @ExperimentalFrpApi val frpCoroutineScope: CoroutineScope diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt index b688eafe12e9..97252b4a199a 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt @@ -137,7 +137,7 @@ internal class LocalFrpNetwork( override suspend fun <R> transact(block: suspend FrpTransactionScope.() -> R): R { val result = CompletableDeferred<R>(coroutineContext[Job]) @Suppress("DeferredResultUnused") - network.transaction { + network.transaction("FrpNetwork.transact") { val buildScope = BuildScopeImpl( stateScope = StateScopeImpl(evalScope = this, endSignal = endSignal), @@ -151,7 +151,7 @@ internal class LocalFrpNetwork( override suspend fun activateSpec(spec: FrpSpec<*>) { val job = network - .transaction { + .transaction("FrpNetwork.activateSpec") { val buildScope = BuildScopeImpl( stateScope = StateScopeImpl(evalScope = this, endSignal = endSignal), @@ -166,7 +166,8 @@ internal class LocalFrpNetwork( override fun <In, Out> coalescingMutableTFlow( coalesce: (old: Out, new: In) -> Out, getInitialValue: () -> Out, - ): CoalescingMutableTFlow<In, Out> = CoalescingMutableTFlow(coalesce, network, getInitialValue) + ): CoalescingMutableTFlow<In, Out> = + CoalescingMutableTFlow(null, coalesce, network, getInitialValue) override fun <T> mutableTFlow(): MutableTFlow<T> = MutableTFlow(network) diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt index 7ba1aca31eae..a175e2e20e46 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt @@ -467,12 +467,12 @@ fun <A> TState<TFlow<A>>.switchPromptly(): TFlow<A> { @ExperimentalFrpApi class CoalescingMutableTFlow<In, Out> internal constructor( + internal val name: String?, internal val coalesce: (old: Out, new: In) -> Out, internal val network: Network, private val getInitialValue: () -> Out, internal val impl: InputNode<Out> = InputNode(), ) : TFlow<Out>() { - internal val name: String? = null internal val storage = AtomicReference(false to getInitialValue()) override fun toString(): String = "${this::class.simpleName}@$hashString" @@ -490,7 +490,7 @@ internal constructor( val (scheduled, _) = storage.getAndUpdate { (_, old) -> true to coalesce(old, value) } if (!scheduled) { @Suppress("DeferredResultUnused") - network.transaction { + network.transaction("CoalescingMutableTFlow${name?.let { "($name)" }.orEmpty()}.emit") { impl.visit(this, storage.getAndSet(false to getInitialValue()).second) } } @@ -520,16 +520,16 @@ internal constructor(internal val network: Network, internal val impl: InputNode @ExperimentalFrpApi suspend fun emit(value: T) { coroutineScope { + var jobOrNull: Job? = null val newEmit = async(start = CoroutineStart.LAZY) { - network.transaction { impl.visit(this, value) }.await() + jobOrNull?.join() + network + .transaction("MutableTFlow($name).emit") { impl.visit(this, value) } + .await() } - val jobOrNull = storage.getAndSet(newEmit) - if (jobOrNull?.isActive != true) { - newEmit.await() - } else { - jobOrNull.join() - } + jobOrNull = storage.getAndSet(newEmit) + newEmit.await() } } diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt index a4c695657f8d..80e74748a375 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt @@ -121,7 +121,7 @@ fun <A, B, C> TState<A>.combineWith( /** * Splits a [TState] of pairs into a pair of [TFlows][TState], where each returned [TState] holds - * hald of the original. + * half of the original. * * Shorthand for: * ```kotlin @@ -312,6 +312,57 @@ fun <A, B, C, D, Z> combine( ) } +/** + * Returns a [TState] whose value is generated with [transform] by combining the current values of + * each given [TState]. + * + * @see TState.combineWith + */ +@ExperimentalFrpApi +fun <A, B, C, D, E, Z> combine( + stateA: TState<A>, + stateB: TState<B>, + stateC: TState<C>, + stateD: TState<D>, + stateE: TState<E>, + transform: suspend FrpScope.(A, B, C, D, E) -> Z, +): TState<Z> { + val operatorName = "combine" + val name = operatorName + return TStateInit( + init(name) { + coroutineScope { + val dl1: Deferred<TStateImpl<A>> = async { + stateA.init.connect(evalScope = this@init) + } + val dl2: Deferred<TStateImpl<B>> = async { + stateB.init.connect(evalScope = this@init) + } + val dl3: Deferred<TStateImpl<C>> = async { + stateC.init.connect(evalScope = this@init) + } + val dl4: Deferred<TStateImpl<D>> = async { + stateD.init.connect(evalScope = this@init) + } + val dl5: Deferred<TStateImpl<E>> = async { + stateE.init.connect(evalScope = this@init) + } + zipStates( + name, + operatorName, + dl1.await(), + dl2.await(), + dl3.await(), + dl4.await(), + dl5.await(), + ) { a, b, c, d, e -> + NoScope.runInFrpScope { transform(a, b, c, d, e) } + } + } + } + ) +} + /** Returns a [TState] by applying [transform] to the value held by the original [TState]. */ @ExperimentalFrpApi fun <A, B> TState<A>.flatMap(transform: suspend FrpScope.(A) -> TState<B>): TState<B> { @@ -367,7 +418,7 @@ fun <A> TState<A>.selector(numDistinctValues: Int? = null): TStateSelector<A> = * @see selector */ @ExperimentalFrpApi -class TStateSelector<A> +class TStateSelector<in A> internal constructor( private val upstream: TState<A>, private val groupedChanges: GroupedTFlow<A, Boolean>, @@ -406,6 +457,7 @@ internal constructor(internal val network: Network, initialValue: Deferred<T>) : private val input: CoalescingMutableTFlow<Deferred<T>, Deferred<T>?> = CoalescingMutableTFlow( + name = null, coalesce = { _, new -> new }, network = network, getInitialValue = { null }, @@ -423,7 +475,7 @@ internal constructor(internal val network: Network, initialValue: Deferred<T>) : .cached() state = TStateSource(name, operatorName, initialValue, calm) @Suppress("DeferredResultUnused") - network.transaction { + network.transaction("MutableTState.init") { calm.activate(evalScope = this, downstream = Schedulable.S(state))?.let { (connection, needsEval) -> state.upstreamConnection = connection diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt index 4f302a14ff00..0674a2e75659 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt @@ -31,6 +31,8 @@ import com.android.systemui.kairos.internal.TStateSource import com.android.systemui.kairos.util.Just import com.android.systemui.kairos.util.Maybe import com.android.systemui.kairos.util.None +import com.android.systemui.kairos.util.flatMap +import com.android.systemui.kairos.util.map import com.android.systemui.kairos.util.none import com.android.systemui.kairos.util.orElseGet @@ -178,3 +180,24 @@ private fun <A> TStateImpl<A>.getUnsafe(): Maybe<A> = is TStateSource -> getStorageUnsafe() is DerivedMapCheap<*, *> -> none } + +private fun <A> TStateImpl<A>.getUnsafeWithEpoch(): Maybe<Pair<A, Long>> = + when (this) { + is TStateDerived -> getCachedUnsafe().map { it to invalidatedEpoch } + is TStateSource -> getStorageUnsafe().map { it to writeEpoch } + is DerivedMapCheap<*, *> -> none + } + +/** + * Returns the current value held in this [TState], or [none] if the [TState] has not been + * initialized. + * + * The returned [Long] is the *epoch* at which the internal cache was last updated. This can be used + * to identify values which are out-of-date. + */ +fun <A> TState<A>.sampleUnsafe(): Maybe<Pair<A, Long>> = + when (this) { + is MutableTState -> tState.init.getUnsafe().flatMap { it.getUnsafeWithEpoch() } + is TStateInit -> init.getUnsafe().flatMap { it.getUnsafeWithEpoch() } + is TStateLoop -> this.init.getUnsafe().flatMap { it.getUnsafeWithEpoch() } + } diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt index 90f1aea3e42f..7e6384925f38 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt @@ -34,9 +34,9 @@ import com.android.systemui.kairos.TFlowInit import com.android.systemui.kairos.groupByKey import com.android.systemui.kairos.init import com.android.systemui.kairos.internal.util.childScope -import com.android.systemui.kairos.internal.util.launchOnCancel import com.android.systemui.kairos.internal.util.mapValuesParallel import com.android.systemui.kairos.launchEffect +import com.android.systemui.kairos.mergeLeft import com.android.systemui.kairos.util.Just import com.android.systemui.kairos.util.Maybe import com.android.systemui.kairos.util.None @@ -49,7 +49,6 @@ import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.startCoroutine import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableJob -import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.Job @@ -86,8 +85,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope builder: suspend S.() -> Unit, ): TFlow<A> { var job: Job? = null - val stopEmitter = newStopEmitter() - val handle = this.job.invokeOnCompletion { stopEmitter.emit(Unit) } + val stopEmitter = newStopEmitter("buildTFlow") // Create a child scope that will be kept alive beyond the end of this transaction. val childScope = coroutineScope.childScope() lateinit var emitter: Pair<T, S> @@ -99,7 +97,6 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope reenterBuildScope(this@BuildScopeImpl, childScope).runInBuildScope { launchEffect { builder(emitter.second) - handle.dispose() stopEmitter.emit(Unit) } } @@ -110,7 +107,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope }, ) emitter = constructFlow(inputNode) - return with(frpScope) { emitter.first.takeUntil(stopEmitter) } + return with(frpScope) { emitter.first.takeUntil(mergeLeft(stopEmitter, endSignal)) } } private fun <T> tFlowInternal(builder: suspend FrpProducerScope<T>.() -> Unit): TFlow<T> = @@ -134,7 +131,8 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope ): TFlow<Out> = buildTFlow( constructFlow = { inputNode -> - val flow = CoalescingMutableTFlow(coalesce, network, getInitialValue, inputNode) + val flow = + CoalescingMutableTFlow(null, coalesce, network, getInitialValue, inputNode) flow to object : FrpCoalescingProducerScope<In> { override fun emit(value: In) { @@ -164,11 +162,13 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope val subRef = AtomicReference<Maybe<Output<A>>>(null) val childScope = coroutineScope.childScope() // When our scope is cancelled, deactivate this observer. - childScope.launchOnCancel(CoroutineName("TFlow.observeEffect")) { + childScope.coroutineContext.job.invokeOnCompletion { subRef.getAndSet(None)?.let { output -> if (output is Just) { @Suppress("DeferredResultUnused") - network.transaction { scheduleDeactivation(output.value) } + network.transaction("observeEffect cancelled") { + scheduleDeactivation(output.value) + } } } } @@ -215,7 +215,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope } else if (needsEval) { outputNode.schedule(evalScope = stateScope.evalScope) } - } ?: childScope.cancel() + } ?: run { childScope.cancel() } } return childScope.coroutineContext.job } @@ -229,10 +229,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope "mapBuild", mapImpl({ init.connect(evalScope = this) }) { spec -> reenterBuildScope(outerScope = this@BuildScopeImpl, childScope) - .runInBuildScope { - val (result, _) = asyncScope { transform(spec) } - result.get() - } + .runInBuildScope { transform(spec) } } .cached(), ) @@ -272,8 +269,9 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope return changes to FrpDeferredValue(initOut) } - private fun newStopEmitter(): CoalescingMutableTFlow<Unit, Unit> = + private fun newStopEmitter(name: String): CoalescingMutableTFlow<Unit, Unit> = CoalescingMutableTFlow( + name = name, coalesce = { _, _: Unit -> }, network = network, getInitialValue = {}, @@ -299,17 +297,19 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope } private fun mutableChildBuildScope(): BuildScopeImpl { - val stopEmitter = newStopEmitter() + val stopEmitter = newStopEmitter("mutableChildBuildScope") val childScope = coroutineScope.childScope() childScope.coroutineContext.job.invokeOnCompletion { stopEmitter.emit(Unit) } // Ensure that once this transaction is done, the new child scope enters the completing // state (kept alive so long as there are child jobs). - scheduleOutput( - OneShot { - // TODO: don't like this cast - (childScope.coroutineContext.job as CompletableJob).complete() - } - ) + // TODO: need to keep the scope alive if it's used to accumulate state. + // Otherwise, stopEmitter will emit early, due to the call to complete(). + // scheduleOutput( + // OneShot { + // // TODO: don't like this cast + // (childScope.coroutineContext.job as CompletableJob).complete() + // } + // ) return BuildScopeImpl( stateScope = StateScopeImpl(evalScope = stateScope.evalScope, endSignal = stopEmitter), coroutineScope = childScope, diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt index 3aec319881d0..04ce5b6d8785 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt @@ -86,7 +86,7 @@ internal class DepthTracker { @Volatile private var dirty_depthIsDirect = true @Volatile private var dirty_isIndirectRoot = false - suspend fun schedule(scheduler: Scheduler, node: MuxNode<*, *, *>) { + fun schedule(scheduler: Scheduler, node: MuxNode<*, *, *>) { if (dirty_depthIsDirect) { scheduler.schedule(dirty_directDepth, node) } else { diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt index af864e6c3496..69994ba6e866 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt @@ -66,8 +66,6 @@ internal interface NetworkScope : InitScope { fun schedule(state: TStateSource<*>) - suspend fun schedule(node: MuxNode<*, *, *>) - fun scheduleDeactivation(node: PushNode<*>) fun scheduleDeactivation(output: Output<*>) diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt index f7ff15f0507b..af68a1e3d83c 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt @@ -188,6 +188,14 @@ internal sealed class MuxNode<K : Any, V, Output>(val lifecycle: MuxLifecycle<Ou } abstract fun hasCurrentValueLocked(transactionStore: TransactionStore): Boolean + + fun schedule(evalScope: EvalScope) { + // TODO: Potential optimization + // Detect if this node is guaranteed to have a single upstream within this transaction, + // then bypass scheduling it. Instead immediately schedule its downstream and treat this + // MuxNode as a Pull (effectively making it a mapCheap). + depthTracker.schedule(evalScope.scheduler, this) + } } /** An input branch of a mux node, associated with a key. */ @@ -202,7 +210,7 @@ internal class MuxBranchNode<K : Any, V>(private val muxNode: MuxNode<K, V, *>, val upstreamResult = upstream.getPushEvent(evalScope) if (upstreamResult is Just) { muxNode.upstreamData[key] = upstreamResult.value - evalScope.schedule(muxNode) + muxNode.schedule(evalScope) } } diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt index 08bee855831a..3b9502a5d812 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt @@ -409,7 +409,7 @@ internal fun <K : Any, A> switchDeferredImpl( // Schedule for evaluation if any switched-in nodes have already emitted within // this transaction. if (muxNode.upstreamData.isNotEmpty()) { - evalScope.schedule(muxNode) + muxNode.schedule(evalScope) } return muxNode.takeUnless { muxNode.switchedIn.isEmpty() && !isIndirect } } diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt index cdfafa943121..b291c879b449 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt @@ -75,7 +75,7 @@ internal class MuxPromptMovingNode<K : Any, V>( if (depthTracker.dirty_depthIncreased()) { depthTracker.schedule(evalScope.compactor, node = this) } - evalScope.schedule(this) + schedule(evalScope) } else { val compactDownstream = depthTracker.isDirty() if (evalResult != null || compactDownstream) { @@ -291,7 +291,7 @@ internal class MuxPromptPatchNode<K : Any, V>(private val muxNode: MuxPromptMovi val upstreamResult = upstream.getPushEvent(evalScope) if (upstreamResult is Just) { muxNode.patchData = upstreamResult.value - evalScope.schedule(muxNode) + muxNode.schedule(evalScope) } } @@ -451,7 +451,7 @@ internal fun <K : Any, A> switchPromptImpl( // Schedule for evaluation if any switched-in nodes or the patches node have // already emitted within this transaction. if (movingNode.patchData != null || movingNode.upstreamData.isNotEmpty()) { - evalScope.schedule(movingNode) + movingNode.schedule(evalScope) } return movingNode.takeUnless { it.patches == null && it.switchedIn.isEmpty() } diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt index f0df89d780c9..599b18695034 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt @@ -81,11 +81,6 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope { stateWrites.add(state) } - // TODO: weird that we have this *and* scheduler exposed - override suspend fun schedule(node: MuxNode<*, *, *>) { - scheduler.schedule(node.depthTracker.dirty_directDepth, node) - } - override fun scheduleDeactivation(node: PushNode<*>) { deactivations.add(node) } @@ -95,9 +90,7 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope { } /** Listens for external events and starts FRP transactions. Runs forever. */ - suspend fun runInputScheduler() = coroutineScope { - launch { scheduler.activate() } - launch { compactor.activate() } + suspend fun runInputScheduler() { val actions = mutableListOf<ScheduledAction<*>>() for (first in inputScheduleChan) { // Drain and conflate all transaction requests into a single transaction @@ -125,12 +118,12 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope { } /** Evaluates [block] inside of a new transaction when the network is ready. */ - fun <R> transaction(block: suspend EvalScope.() -> R): Deferred<R> = + fun <R> transaction(reason: String, block: suspend EvalScope.() -> R): Deferred<R> = CompletableDeferred<R>(parent = coroutineScope.coroutineContext.job).also { onResult -> val job = coroutineScope.launch { inputScheduleChan.send( - ScheduledAction(onStartTransaction = block, onResult = onResult) + ScheduledAction(reason, onStartTransaction = block, onResult = onResult) ) } onResult.invokeOnCompletion { job.cancel() } @@ -229,6 +222,7 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope { } internal class ScheduledAction<T>( + val reason: String, private val onResult: CompletableDeferred<T>? = null, private val onStartTransaction: suspend EvalScope.() -> T, ) { diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt index 872fb7a6cb74..c12ef6ae6a5d 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt @@ -21,44 +21,34 @@ package com.android.systemui.kairos.internal import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.PriorityBlockingQueue import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch internal interface Scheduler { - suspend fun schedule(depth: Int, node: MuxNode<*, *, *>) + fun schedule(depth: Int, node: MuxNode<*, *, *>) - suspend fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>) + fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>) } internal class SchedulerImpl : Scheduler { val enqueued = ConcurrentHashMap<MuxNode<*, *, *>, Any>() val scheduledQ = PriorityBlockingQueue<Pair<Int, MuxNode<*, *, *>>>(16, compareBy { it.first }) - val chan = Channel<Pair<Int, MuxNode<*, *, *>>>(Channel.UNLIMITED) - override suspend fun schedule(depth: Int, node: MuxNode<*, *, *>) { + override fun schedule(depth: Int, node: MuxNode<*, *, *>) { if (enqueued.putIfAbsent(node, node) == null) { - chan.send(Pair(depth, node)) + scheduledQ.add(Pair(depth, node)) } } - override suspend fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>) { + override fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>) { schedule(Int.MIN_VALUE + indirectDepth, node) } - suspend fun activate() { - for (nodeSchedule in chan) { - scheduledQ.add(nodeSchedule) - drainChan() - } - } - internal suspend fun drainEval(network: Network) { drain { runStep -> runStep { muxNode -> network.evalScope { muxNode.visit(this) } } // If any visited MuxPromptNodes had their depths increased, eagerly propagate those - // depth - // changes now before performing further network evaluation. + // depth changes now before performing further network evaluation. network.compactor.drainCompact() } } @@ -71,19 +61,12 @@ internal class SchedulerImpl : Scheduler { crossinline onStep: suspend (runStep: suspend (visit: suspend (MuxNode<*, *, *>) -> Unit) -> Unit) -> Unit ): Unit = coroutineScope { - while (!chan.isEmpty || scheduledQ.isNotEmpty()) { - drainChan() + while (scheduledQ.isNotEmpty()) { val maxDepth = scheduledQ.peek()?.first ?: error("Unexpected empty scheduler") onStep { visit -> runStep(maxDepth, visit) } } } - private suspend fun drainChan() { - while (!chan.isEmpty) { - scheduledQ.add(chan.receive()) - } - } - private suspend inline fun runStep( maxDepth: Int, crossinline visit: suspend (MuxNode<*, *, *>) -> Unit, diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt index 5cec05c8ef2d..c68b4c366776 100644 --- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt +++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt @@ -314,6 +314,28 @@ internal fun <A, B, C, D, Z> zipStates( @Suppress("UNCHECKED_CAST") transform(a as A, b as B, c as C, d as D) } +internal fun <A, B, C, D, E, Z> zipStates( + name: String?, + operatorName: String, + l1: TStateImpl<A>, + l2: TStateImpl<B>, + l3: TStateImpl<C>, + l4: TStateImpl<D>, + l5: TStateImpl<E>, + transform: suspend EvalScope.(A, B, C, D, E) -> Z, +): TStateImpl<Z> = + zipStates(null, operatorName, mapOf(0 to l1, 1 to l2, 2 to l3, 3 to l4, 4 to l5)).map( + name, + operatorName, + ) { + val a = it.getValue(0) + val b = it.getValue(1) + val c = it.getValue(2) + val d = it.getValue(3) + val e = it.getValue(4) + @Suppress("UNCHECKED_CAST") transform(a as A, b as B, c as C, d as D, e as E) + } + internal fun <K : Any, A> zipStates( name: String?, operatorName: String, diff --git a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt index 165230b2aeaf..688adae8fcae 100644 --- a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt +++ b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt @@ -1170,12 +1170,12 @@ class KairosTests { mergeIncrementally .onEach { println("patch: $it") } .foldMapIncrementally() - .flatMap { it.combineValues() } + .flatMap { it.combine() } } } } .foldMapIncrementally() - .flatMap { it.combineValues() } + .flatMap { it.combine() } accState.toStateFlow() } @@ -1300,6 +1300,26 @@ class KairosTests { } @Test + fun buildScope_stateAccumulation() = runFrpTest { network -> + val input = network.mutableTFlow<Unit>() + var observedCount: Int? = null + activateSpec(network) { + val (c, j) = asyncScope { input.fold(0) { _, x -> x + 1 } } + deferredBuildScopeAction { c.get().observe { observedCount = it } } + } + runCurrent() + assertEquals(0, observedCount) + + input.emit(Unit) + runCurrent() + assertEquals(1, observedCount) + + input.emit(Unit) + runCurrent() + assertEquals(2, observedCount) + } + + @Test fun effect() = runFrpTest { network -> val input = network.mutableTFlow<Unit>() var effectRunning = false diff --git a/packages/Vcn/flags/Android.bp b/packages/Vcn/flags/Android.bp index 3943c6f7fe24..8d09fdbfa3de 100644 --- a/packages/Vcn/flags/Android.bp +++ b/packages/Vcn/flags/Android.bp @@ -29,10 +29,24 @@ aconfig_declarations { ], } +// TODO: b/374174952 Remove this library when VCN modularization is done java_aconfig_library { name: "android.net.vcn.flags-aconfig-java-export", aconfig_declarations: "android.net.vcn.flags-aconfig", mode: "exported", min_sdk_version: "35", defaults: ["framework-minus-apex-aconfig-java-defaults"], + apex_available: [ + "//apex_available:platform", + ], +} + +java_aconfig_library { + name: "android.net.vcn.flags-aconfig-java", + aconfig_declarations: "android.net.vcn.flags-aconfig", + min_sdk_version: "35", + defaults: ["framework-minus-apex-aconfig-java-defaults"], + apex_available: [ + "com.android.tethering", + ], } diff --git a/packages/Vcn/framework-b/Android.bp b/packages/Vcn/framework-b/Android.bp index c3121162b7f2..edb22c0e7aa0 100644 --- a/packages/Vcn/framework-b/Android.bp +++ b/packages/Vcn/framework-b/Android.bp @@ -32,9 +32,9 @@ filegroup { } java_defaults { - name: "framework-connectivity-b-defaults", + name: "framework-connectivity-b-defaults-base", sdk_version: "module_current", - min_sdk_version: "35", // TODO: Make it Android 25Q2 when this is included in mainline + defaults: ["framework-module-defaults"], // This is a boot jar srcs: [ @@ -44,14 +44,10 @@ java_defaults { libs: [ "android.net.ipsec.ike.stubs.module_lib", - "app-compat-annotations", "framework-wifi.stubs.module_lib", "unsupportedappusage", ], - static_libs: [ - //TODO:375213246 Use a non-exported flag lib when VCN is in mainline - "android.net.vcn.flags-aconfig-java-export", - ], + aidl: { include_dirs: [ // For connectivity-framework classes such as Network.aidl, NetworkCapabilities.aidl @@ -60,16 +56,83 @@ java_defaults { }, } +soong_config_module_type { + name: "framework_connectivity_b_defaults_soong_config", + module_type: "java_defaults", + config_namespace: "ANDROID", + bool_variables: [ + "is_vcn_in_mainline", + ], + properties: [ + "min_sdk_version", + "static_libs", + "apex_available", + ], +} + +framework_connectivity_b_defaults_soong_config { + name: "framework-connectivity-b-defaults", + defaults: [ + "framework-connectivity-b-defaults-base", + ], + soong_config_variables: { + is_vcn_in_mainline: { + //TODO: b/380155299 Make it Baklava when aidl tool can understand it + min_sdk_version: "current", + static_libs: ["android.net.vcn.flags-aconfig-java"], + apex_available: ["com.android.tethering"], + + conditions_default: { + min_sdk_version: "35", + static_libs: ["android.net.vcn.flags-aconfig-java-export"], + apex_available: ["//apex_available:platform"], + }, + }, + }, +} + +soong_config_module_type { + name: "framework_connectivity_b_java_sdk_library_defaults_soong_config", + module_type: "java_defaults", + config_namespace: "ANDROID", + bool_variables: [ + "is_vcn_in_mainline", + ], + properties: [ + "aconfig_declarations", + "jarjar_rules", + ], +} + +framework_connectivity_b_java_sdk_library_defaults_soong_config { + name: "framework-connectivity-b-java-sdk-library-defaults", + soong_config_variables: { + is_vcn_in_mainline: { + aconfig_declarations: ["android.net.vcn.flags-aconfig-java"], + + // TODO: b/375213246 Use the connectivity jarjar rule generator to create the + // jarjar rules. In the end state, use "framework-connectivity-jarjar-rules" + // after VCN code is moved to the Connectivity folder + jarjar_rules: "framework-vcn-jarjar-rules.txt", + + conditions_default: { + aconfig_declarations: ["android.net.vcn.flags-aconfig-java-export"], + + // Use "android.net.connectivity" as prefix would trigger + // "Hidden API flags are inconsistent" build error + jarjar_rules: "framework-vcn-jarjar-rules-platform.txt", + }, + }, + }, +} + java_sdk_library { name: "framework-connectivity-b", defaults: [ "framework-connectivity-b-defaults", + "framework-connectivity-b-java-sdk-library-defaults", ], - //TODO: b/375213246 Use "framework-connectivity-jarjar-rules" when VCN is - // in mainline - jarjar_rules: "framework-vcn-jarjar-rules.txt", - permitted_packages: [ "android.net", "android.net.vcn", @@ -92,11 +155,6 @@ java_sdk_library { "framework-connectivity-pre-jarjar", ], - aconfig_declarations: [ - //TODO:375213246 Use a non-exported flag lib when VCN is in mainline - "android.net.vcn.flags-aconfig-java-export", - ], - impl_library_visibility: [ // Using for test only "//cts/tests/netlegacy22.api", @@ -120,17 +178,13 @@ java_sdk_library { "//packages/modules/Wifi/service/tests/wifitests", ], - apex_available: [ - // TODO: b/374174952 Remove it when VCN modularization is released - "//apex_available:platform", - - "com.android.tethering", - ], + visibility: ["//packages/modules/Connectivity:__subpackages__"], } java_library { name: "framework-connectivity-b-pre-jarjar", defaults: ["framework-connectivity-b-defaults"], + installable: false, libs: [ "framework-connectivity-pre-jarjar", ], diff --git a/packages/Vcn/framework-b/framework-vcn-jarjar-rules-platform.txt b/packages/Vcn/framework-b/framework-vcn-jarjar-rules-platform.txt new file mode 100644 index 000000000000..757043bdbbc0 --- /dev/null +++ b/packages/Vcn/framework-b/framework-vcn-jarjar-rules-platform.txt @@ -0,0 +1,2 @@ +rule android.net.vcn.persistablebundleutils.** android.net.vcn.module.repackaged.persistablebundleutils.@1 +rule android.net.vcn.util.** android.net.vcn.module.repackaged.util.@1
\ No newline at end of file diff --git a/packages/Vcn/framework-b/framework-vcn-jarjar-rules.txt b/packages/Vcn/framework-b/framework-vcn-jarjar-rules.txt index 757043bdbbc0..7e27b24f749c 100644 --- a/packages/Vcn/framework-b/framework-vcn-jarjar-rules.txt +++ b/packages/Vcn/framework-b/framework-vcn-jarjar-rules.txt @@ -1,2 +1,2 @@ -rule android.net.vcn.persistablebundleutils.** android.net.vcn.module.repackaged.persistablebundleutils.@1 -rule android.net.vcn.util.** android.net.vcn.module.repackaged.util.@1
\ No newline at end of file +rule android.net.vcn.persistablebundleutils.** android.net.connectivity.android.net.vcn.persistablebundleutils.@1 +rule android.net.vcn.util.** android.net.connectivity.android.net.vcn.util.@1
\ No newline at end of file diff --git a/packages/Vcn/framework-b/src/android/net/ConnectivityFrameworkInitializerBaklava.java b/packages/Vcn/framework-b/src/android/net/ConnectivityFrameworkInitializerBaklava.java index 1f0fa92d7976..de22ca684871 100644 --- a/packages/Vcn/framework-b/src/android/net/ConnectivityFrameworkInitializerBaklava.java +++ b/packages/Vcn/framework-b/src/android/net/ConnectivityFrameworkInitializerBaklava.java @@ -23,8 +23,6 @@ import android.annotation.Nullable; import android.annotation.SystemApi; import android.app.SystemServiceRegistry; import android.compat.Compatibility; -import android.compat.annotation.ChangeId; -import android.compat.annotation.EnabledSince; import android.content.Context; import android.content.pm.PackageManager; import android.net.vcn.IVcnManagementService; @@ -40,17 +38,15 @@ import android.os.SystemProperties; @FlaggedApi(FLAG_MAINLINE_VCN_MODULE_API) @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public final class ConnectivityFrameworkInitializerBaklava { - /** - * Starting with {@link VANILLA_ICE_CREAM}, Telephony feature flags (e.g. {@link - * PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}) are being checked before returning managers - * that depend on them. If the feature is missing, {@link Context#getSystemService} will return - * null. - * - * <p>This change is specific to VcnManager. - */ - @ChangeId - @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM) - private static final long ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN = 330902016; + + // This is a copy of TelephonyFrameworkInitializer.ENABLE_CHECKING_TELEPHONY_FEATURES. This + // ChangeId will replace ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN to gate VcnManager + // feature flag enforcement. + // This replacement is safe because both ChangeIds have been enabled since Android V and serve + // the same purpose: enforcing telephony feature flag checks before using telephony-based + // features. This also simplifies VCN modularization by avoiding the need to handle different + // states, such as: SDK < B vs. SDK >= B; VCN in platform vs. VCN in the apex. + private static final long ENABLE_CHECKING_TELEPHONY_FEATURES = 330583731; /** * The corresponding vendor API for Android V @@ -71,7 +67,7 @@ public final class ConnectivityFrameworkInitializerBaklava { private static String getVcnFeatureDependency() { // Check SDK version of the client app. Apps targeting pre-V SDK might // have not checked for existence of these features. - if (!Compatibility.isChangeEnabled(ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN)) { + if (!Compatibility.isChangeEnabled(ENABLE_CHECKING_TELEPHONY_FEATURES)) { return null; } diff --git a/packages/Vcn/service-b/Android.bp b/packages/Vcn/service-b/Android.bp index c1a1ee7875d0..1370b0678cc5 100644 --- a/packages/Vcn/service-b/Android.bp +++ b/packages/Vcn/service-b/Android.bp @@ -32,11 +32,9 @@ filegroup { visibility: ["//frameworks/base/services/core"], } -// Do not static include this lib in VCN because these files exist in -// both service-connectivity.jar and framework.jar -// TODO: b/374174952 After VCN moves to Connectivity/ and the modularization is done -// this lib can be removed and "service-connectivity-b-pre-jarjar" can include -// "service-connectivity-pre-jarjar" +// TODO: b/374174952 This library is only used in "service-connectivity-b-platform" +// After VCN moves to Connectivity/ and the modularization is done, this lib and +// "service-connectivity-b-platform" can both be removed java_library { name: "connectivity-utils-service-vcn-internal", sdk_version: "module_current", @@ -48,30 +46,30 @@ java_library { "framework-annotations-lib", "unsupportedappusage", ], - visibility: [ - "//visibility:private", - ], - apex_available: [ - // TODO: b/374174952 Remove it when VCN modularization is released - "//apex_available:platform", + visibility: ["//visibility:private"], +} - "com.android.tethering", +filegroup { + name: "service-vcn-sources", + srcs: ["src/**/*.java"], + path: "src", + visibility: [ + "//packages/modules/Connectivity/service-b", ], } -java_library { - name: "service-connectivity-b-pre-jarjar", - sdk_version: "system_server_current", - min_sdk_version: "35", // TODO: Make it Android 25Q2 when this is included in mainline +// This java_defaults will be used for "service-connectivity-b-platform" and +// "service-connectivity-b-pre-jarjar" +java_defaults { + name: "service-connectivity-b-pre-jarjar-defaults", defaults: ["framework-system-server-module-defaults"], // This is a system server jar srcs: [ - "src/**/*.java", + ":service-vcn-sources", ], libs: [ "android.net.ipsec.ike.stubs.module_lib", - "connectivity-utils-service-vcn-internal", "framework-annotations-lib", "framework-connectivity-pre-jarjar", "framework-connectivity-t-pre-jarjar", @@ -89,13 +87,30 @@ java_library { "modules-utils-handlerexecutor", ], + defaults_visibility: [ + "//packages/modules/Connectivity/service-b", + ], +} + +// This library is only used to be included into services.jar when the build system +// flag RELEASE_MOVE_VCN_TO_MAINLINE is disabled. When the flag is enabled, a module +// version of this library will be included in Tethering module +java_library { + name: "service-connectivity-b-platform", + defaults: ["service-connectivity-b-pre-jarjar-defaults"], + static_libs: ["connectivity-utils-service-vcn-internal"], + + sdk_version: "system_server_current", + min_sdk_version: "35", + + // TODO (b/374174952 ): This file is for jarjaring files in + // "connectivity-utils-service-vcn-internal". + jarjar_rules: "service-vcn-platform-jarjar-rules.txt", + visibility: [ "//frameworks/base/services", ], apex_available: [ - // TODO: b/374174952 Remove it when VCN modularization is released "//apex_available:platform", - - "com.android.tethering", ], } diff --git a/packages/Vcn/service-b/service-vcn-platform-jarjar-rules.txt b/packages/Vcn/service-b/service-vcn-platform-jarjar-rules.txt new file mode 100644 index 000000000000..36307277b4b9 --- /dev/null +++ b/packages/Vcn/service-b/service-vcn-platform-jarjar-rules.txt @@ -0,0 +1,5 @@ +rule android.util.IndentingPrintWriter android.net.vcn.module.repackaged.android.util.IndentingPrintWriter +rule android.util.LocalLog android.net.vcn.module.repackaged.android.util.LocalLog +rule com.android.internal.util.IndentingPrintWriter android.net.vcn.module.repackaged.com.android.internal.util.IndentingPrintWriter +rule com.android.internal.util.MessageUtils android.net.vcn.module.repackaged.com.android.internal.util.MessageUtils +rule com.android.internal.util.WakeupMessage android.net.vcn.module.repackaged.com.android.internal.util.WakeupMessage
\ No newline at end of file diff --git a/packages/Vcn/service-b/src/com/android/server/ConnectivityServiceInitializerB.java b/packages/Vcn/service-b/src/com/android/server/ConnectivityServiceInitializerB.java index 02c8ce4f29e9..81c7edf4adf1 100644 --- a/packages/Vcn/service-b/src/com/android/server/ConnectivityServiceInitializerB.java +++ b/packages/Vcn/service-b/src/com/android/server/ConnectivityServiceInitializerB.java @@ -16,7 +16,9 @@ package com.android.server; +import android.annotation.TargetApi; import android.content.Context; +import android.os.Build; import android.util.Log; import com.android.tools.r8.keepanno.annotations.KeepItemKind; @@ -30,6 +32,8 @@ import com.android.tools.r8.keepanno.annotations.UsedByReflection; // Without this annotation, this class will be treated as unused class and be removed during build // time. @UsedByReflection(kind = KeepItemKind.CLASS_AND_METHODS) +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public final class ConnectivityServiceInitializerB extends SystemService { private static final String TAG = ConnectivityServiceInitializerB.class.getSimpleName(); private final VcnManagementService mVcnManagementService; diff --git a/packages/Vcn/service-b/src/com/android/server/VcnManagementService.java b/packages/Vcn/service-b/src/com/android/server/VcnManagementService.java index 26db6a988e31..c9a99d729e91 100644 --- a/packages/Vcn/service-b/src/com/android/server/VcnManagementService.java +++ b/packages/Vcn/service-b/src/com/android/server/VcnManagementService.java @@ -37,6 +37,7 @@ import static java.util.Objects.requireNonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; +import android.annotation.TargetApi; import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -164,6 +165,8 @@ import java.util.concurrent.TimeUnit; * @hide */ // TODO(b/180451994): ensure all incoming + outgoing calls have a cleared calling identity +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class VcnManagementService extends IVcnManagementService.Stub { @NonNull private static final String TAG = VcnManagementService.class.getSimpleName(); @NonNull private static final String CONTEXT_ATTRIBUTION_TAG = "VCN"; @@ -297,8 +300,10 @@ public class VcnManagementService extends IVcnManagementService.Stub { }); } - // Package-visibility for SystemServer to create instances. - static VcnManagementService create(@NonNull Context context) { + /** Called by ConnectivityServiceInitializerB to create instances. */ + // VcnManagementService will be jarjared but ConnectivityServiceInitializerB will not. Thus this + // method needs to be public for ConnectivityServiceInitializerB to access + public static VcnManagementService create(@NonNull Context context) { return new VcnManagementService(context, new Dependencies()); } diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/TelephonySubscriptionTracker.java b/packages/Vcn/service-b/src/com/android/server/vcn/TelephonySubscriptionTracker.java index b448f7595b3b..b04e25dff276 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/TelephonySubscriptionTracker.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/TelephonySubscriptionTracker.java @@ -22,12 +22,14 @@ import static android.telephony.TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.vcn.VcnManager; import android.net.vcn.util.PersistableBundleUtils.PersistableBundleWrapper; +import android.os.Build; import android.os.Handler; import android.os.ParcelUuid; import android.os.PersistableBundle; @@ -77,6 +79,8 @@ import java.util.Set; * * @hide */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class TelephonySubscriptionTracker extends BroadcastReceiver { @NonNull private static final String TAG = TelephonySubscriptionTracker.class.getSimpleName(); private static final boolean LOG_DBG = false; // STOPSHIP if true diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/Vcn.java b/packages/Vcn/service-b/src/com/android/server/vcn/Vcn.java index 2524d0eedac3..369ef6ae6a3f 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/Vcn.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/Vcn.java @@ -29,6 +29,7 @@ import static com.android.server.VcnManagementService.VDBG; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TargetApi; import android.content.ContentResolver; import android.database.ContentObserver; import android.net.NetworkCapabilities; @@ -39,6 +40,7 @@ import android.net.vcn.VcnConfig; import android.net.vcn.VcnGatewayConnectionConfig; import android.net.vcn.VcnManager.VcnErrorCode; import android.net.vcn.util.LogUtils; +import android.os.Build; import android.os.Handler; import android.os.Message; import android.os.ParcelUuid; @@ -75,6 +77,8 @@ import java.util.Set; * * @hide */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class Vcn extends Handler { private static final String TAG = Vcn.class.getSimpleName(); diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java b/packages/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java index e50fc3a6e8b9..300b80f942ef 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java @@ -37,6 +37,8 @@ import static com.android.server.VcnManagementService.VDBG; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.annotation.TargetApi; import android.content.Context; import android.net.ConnectivityDiagnosticsManager; import android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback; @@ -82,6 +84,7 @@ import android.net.vcn.util.LogUtils; import android.net.vcn.util.MtuUtils; import android.net.vcn.util.OneWayBoolean; import android.net.wifi.WifiInfo; +import android.os.Build; import android.os.Handler; import android.os.Message; import android.os.ParcelUuid; @@ -171,6 +174,8 @@ import java.util.function.Consumer; * * @hide */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class VcnGatewayConnection extends StateMachine { private static final String TAG = VcnGatewayConnection.class.getSimpleName(); @@ -2942,6 +2947,10 @@ public class VcnGatewayConnection extends StateMachine { * * <p>Synchronize this action to minimize locking around WakeLock use. */ + // WakelockTimeout suppressed because the time the wake lock is needed for is unknown. The + // wakelock is only acquired when a Message is sent to this state machine and will be + // released when the message is processed or the state machin quits + @SuppressLint("WakelockTimeout") public synchronized void acquire() { mImpl.acquire(); } diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/VcnNetworkProvider.java b/packages/Vcn/service-b/src/com/android/server/vcn/VcnNetworkProvider.java index 4552f509b59a..99c848f53c39 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/VcnNetworkProvider.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/VcnNetworkProvider.java @@ -25,6 +25,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static com.android.server.VcnManagementService.VDBG; import android.annotation.NonNull; +import android.annotation.TargetApi; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkCapabilities; @@ -32,6 +33,7 @@ import android.net.NetworkProvider; import android.net.NetworkRequest; import android.net.NetworkScore; import android.net.vcn.VcnGatewayConnectionConfig; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.ArraySet; @@ -54,6 +56,8 @@ import java.util.concurrent.Executor; * * @hide */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class VcnNetworkProvider extends NetworkProvider { private static final String TAG = VcnNetworkProvider.class.getSimpleName(); diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java index 72de61363d26..6467af4355f6 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java @@ -23,6 +23,7 @@ import static com.android.internal.annotations.VisibleForTesting.Visibility; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -31,6 +32,7 @@ import android.net.ConnectivityManager; import android.net.IpSecTransformState; import android.net.Network; import android.net.vcn.VcnManager; +import android.os.Build; import android.os.Handler; import android.os.OutcomeReceiver; import android.os.PowerManager; @@ -59,6 +61,8 @@ import java.util.concurrent.TimeUnit; * * <p>This class is flag gated by "network_metric_monitor" and "ipsec_tramsform_state" */ +// TODO(b/374174952) Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class IpSecPacketLossDetector extends NetworkMetricMonitor { private static final String TAG = IpSecPacketLossDetector.class.getSimpleName(); diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkMetricMonitor.java b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkMetricMonitor.java index 86cee554be6f..14853440a129 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkMetricMonitor.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkMetricMonitor.java @@ -22,9 +22,11 @@ import static com.android.server.VcnManagementService.LOCAL_LOG; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TargetApi; import android.net.IpSecTransform; import android.net.IpSecTransformState; import android.net.Network; +import android.os.Build; import android.os.OutcomeReceiver; import android.util.CloseGuard; import android.util.Slog; @@ -42,6 +44,8 @@ import java.util.concurrent.Executor; * * <p>This class is flag gated by "network_metric_monitor" */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public abstract class NetworkMetricMonitor implements AutoCloseable { private static final String TAG = NetworkMetricMonitor.class.getSimpleName(); diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java index 79c4116d0cd4..705141f3f1b4 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java @@ -29,12 +29,14 @@ import static com.android.server.VcnManagementService.LOCAL_LOG; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TargetApi; import android.net.NetworkCapabilities; import android.net.TelephonyNetworkSpecifier; import android.net.vcn.VcnCellUnderlyingNetworkTemplate; import android.net.vcn.VcnManager; import android.net.vcn.VcnUnderlyingNetworkTemplate; import android.net.vcn.VcnWifiUnderlyingNetworkTemplate; +import android.os.Build; import android.os.ParcelUuid; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -50,6 +52,8 @@ import java.util.Map; import java.util.Set; /** @hide */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) class NetworkPriorityClassifier { @NonNull private static final String TAG = NetworkPriorityClassifier.class.getSimpleName(); /** diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkController.java b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkController.java index 29a0762f5fe8..bc552e7e6afd 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkController.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkController.java @@ -28,6 +28,7 @@ import static com.android.server.vcn.routeselection.NetworkPriorityClassifier.ge import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TargetApi; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.IpSecTransform; @@ -40,6 +41,7 @@ import android.net.vcn.VcnCellUnderlyingNetworkTemplate; import android.net.vcn.VcnGatewayConnectionConfig; import android.net.vcn.VcnUnderlyingNetworkTemplate; import android.net.vcn.util.LogUtils; +import android.os.Build; import android.os.Handler; import android.os.ParcelUuid; import android.telephony.TelephonyCallback; @@ -73,6 +75,8 @@ import java.util.TreeSet; * * @hide */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class UnderlyingNetworkController { @NonNull private static final String TAG = UnderlyingNetworkController.class.getSimpleName(); diff --git a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java index 30f4ed1b9f0b..776931bad73b 100644 --- a/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java +++ b/packages/Vcn/service-b/src/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java @@ -22,12 +22,14 @@ import static com.android.server.VcnManagementService.LOCAL_LOG; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TargetApi; import android.net.IpSecTransform; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; import android.net.vcn.VcnManager; import android.net.vcn.VcnUnderlyingNetworkTemplate; +import android.os.Build; import android.os.Handler; import android.os.ParcelUuid; import android.util.IndentingPrintWriter; @@ -50,6 +52,8 @@ import java.util.concurrent.TimeUnit; * * @hide */ +// TODO(b/374174952): Replace VANILLA_ICE_CREAM with BAKLAVA after Android B finalization +@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public class UnderlyingNetworkEvaluator { private static final String TAG = UnderlyingNetworkEvaluator.class.getSimpleName(); diff --git a/ravenwood/scripts/extract-last-soong-commands.py b/ravenwood/scripts/extract-last-soong-commands.py index bdc1de0c44f4..c08d4aa799a5 100755 --- a/ravenwood/scripts/extract-last-soong-commands.py +++ b/ravenwood/scripts/extract-last-soong-commands.py @@ -48,6 +48,7 @@ def main(args): with open(outfile, "w") as out: out.write(HEADER) + count = 0 with gzip.open(log) as f: for line in f: s = line.decode("utf-8") @@ -63,7 +64,8 @@ def main(args): if m: command = m.groups()[0] - out.write('#========\n') + count += 1 + out.write(f'### Command {count} ========\n') # Show the full command line before executing it. out.write('#echo ' + shlex.quote(command) + '\n') diff --git a/services/Android.bp b/services/Android.bp index a7cb9bb9af24..473911f08cf7 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -312,9 +312,11 @@ system_java_library { "services.wifi", "service-blobstore", "service-jobscheduler", - "service-connectivity-b-pre-jarjar", // Move it to mainline module "android.hidl.base-V1.0-java", - ], + ] + select(release_flag("RELEASE_MOVE_VCN_TO_MAINLINE"), { + true: [], + default: ["service-connectivity-b-platform"], + }), libs: [ "android.hidl.manager-V1.0-java", diff --git a/services/appfunctions/Android.bp b/services/appfunctions/Android.bp index eb6e46861898..7337aa26c145 100644 --- a/services/appfunctions/Android.bp +++ b/services/appfunctions/Android.bp @@ -19,6 +19,7 @@ java_library_static { defaults: ["platform_service_defaults"], srcs: [ ":services.appfunctions-sources", + ":statslog-appfunctions-java-gen", "java/**/*.logtags", ], libs: ["services.core"], @@ -26,3 +27,10 @@ java_library_static { baseline_filename: "lint-baseline.xml", }, } + +genrule { + name: "statslog-appfunctions-java-gen", + tools: ["stats-log-api-gen"], + cmd: "$(location stats-log-api-gen) --java $(out) --module appfunctions --javaPackage com.android.server.appfunctions --javaClass AppFunctionsStatsLog --minApiLevel 35", + out: ["java/com/android/server/appfunctions/AppFunctionsStatsLog.java"], +} diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java index 81e83b563945..eaea4435099c 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java @@ -16,6 +16,8 @@ package com.android.server.appfunctions; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -35,6 +37,11 @@ public final class AppFunctionExecutors { /* workQueue= */ new LinkedBlockingQueue<>(), new NamedThreadFactory("AppFunctionExecutors")); + /** Executor for stats logging. */ + public static final ExecutorService LOGGING_THREAD_EXECUTOR = + Executors.newSingleThreadExecutor( + new NamedThreadFactory("AppFunctionsLoggingExecutors")); + static { THREAD_POOL_EXECUTOR.allowCoreThreadTimeOut(true); } diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java index c17c34061d1b..669025f071c0 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java @@ -30,6 +30,7 @@ import android.app.appfunctions.AppFunctionManagerHelper; import android.app.appfunctions.AppFunctionRuntimeMetadata; import android.app.appfunctions.AppFunctionStaticMetadataHelper; import android.app.appfunctions.ExecuteAppFunctionAidlRequest; +import android.app.appfunctions.ExecuteAppFunctionResponse; import android.app.appfunctions.IAppFunctionEnabledCallback; import android.app.appfunctions.IAppFunctionManager; import android.app.appfunctions.IAppFunctionService; @@ -85,6 +86,7 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { private final ServiceConfig mServiceConfig; private final Context mContext; private final Map<String, Object> mLocks = new WeakHashMap<>(); + private final AppFunctionsLoggerWrapper mLoggerWrapper; public AppFunctionManagerServiceImpl(@NonNull Context context) { this( @@ -93,7 +95,8 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { context, IAppFunctionService.Stub::asInterface, THREAD_POOL_EXECUTOR), new CallerValidatorImpl(context), new ServiceHelperImpl(context), - new ServiceConfigImpl()); + new ServiceConfigImpl(), + new AppFunctionsLoggerWrapper(context)); } @VisibleForTesting @@ -102,12 +105,14 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { RemoteServiceCaller<IAppFunctionService> remoteServiceCaller, CallerValidator callerValidator, ServiceHelper appFunctionInternalServiceHelper, - ServiceConfig serviceConfig) { + ServiceConfig serviceConfig, + AppFunctionsLoggerWrapper loggerWrapper) { mContext = Objects.requireNonNull(context); mRemoteServiceCaller = Objects.requireNonNull(remoteServiceCaller); mCallerValidator = Objects.requireNonNull(callerValidator); mInternalServiceHelper = Objects.requireNonNull(appFunctionInternalServiceHelper); mServiceConfig = serviceConfig; + mLoggerWrapper = loggerWrapper; } /** Called when the user is unlocked. */ @@ -146,8 +151,27 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { Objects.requireNonNull(requestInternal); Objects.requireNonNull(executeAppFunctionCallback); + int callingUid = Binder.getCallingUid(); + int callingPid = Binder.getCallingPid(); + final SafeOneTimeExecuteAppFunctionCallback safeExecuteAppFunctionCallback = - new SafeOneTimeExecuteAppFunctionCallback(executeAppFunctionCallback); + new SafeOneTimeExecuteAppFunctionCallback(executeAppFunctionCallback, + new SafeOneTimeExecuteAppFunctionCallback.CompletionCallback() { + @Override + public void finalizeOnSuccess( + @NonNull ExecuteAppFunctionResponse result, + long executionStartTimeMillis) { + mLoggerWrapper.logAppFunctionSuccess(requestInternal, result, + callingUid, executionStartTimeMillis); + } + + @Override + public void finalizeOnError(@NonNull AppFunctionException error, + long executionStartTimeMillis) { + mLoggerWrapper.logAppFunctionError(requestInternal, + error.getErrorCode(), callingUid, executionStartTimeMillis); + } + }); String validatedCallingPackage; try { @@ -162,9 +186,6 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { return null; } - int callingUid = Binder.getCallingUid(); - int callingPid = Binder.getCallingPid(); - ICancellationSignal localCancelTransport = CancellationSignal.createTransport(); THREAD_POOL_EXECUTOR.execute( diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionsLoggerWrapper.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionsLoggerWrapper.java new file mode 100644 index 000000000000..7ba1bbc536f6 --- /dev/null +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionsLoggerWrapper.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.appfunctions; + +import static com.android.server.appfunctions.AppFunctionExecutors.LOGGING_THREAD_EXECUTOR; + +import android.annotation.NonNull; +import android.app.appfunctions.ExecuteAppFunctionAidlRequest; +import android.app.appfunctions.ExecuteAppFunctionResponse; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.SystemClock; +import android.util.Slog; + +import java.util.Objects; + +/** Wraps AppFunctionsStatsLog. */ +public class AppFunctionsLoggerWrapper { + private static final String TAG = AppFunctionsLoggerWrapper.class.getSimpleName(); + + private static final int SUCCESS_RESPONSE_CODE = -1; + + private final Context mContext; + + public AppFunctionsLoggerWrapper(@NonNull Context context) { + mContext = Objects.requireNonNull(context); + } + + void logAppFunctionSuccess(ExecuteAppFunctionAidlRequest request, + ExecuteAppFunctionResponse response, int callingUid, long executionStartTimeMillis) { + logAppFunctionsRequestReported(request, SUCCESS_RESPONSE_CODE, + response.getResponseDataSize(), callingUid, executionStartTimeMillis); + } + + void logAppFunctionError(ExecuteAppFunctionAidlRequest request, int errorCode, int callingUid, + long executionStartTimeMillis) { + logAppFunctionsRequestReported(request, errorCode, /* responseSizeBytes = */ 0, callingUid, + executionStartTimeMillis); + } + + private void logAppFunctionsRequestReported(ExecuteAppFunctionAidlRequest request, + int errorCode, int responseSizeBytes, int callingUid, long executionStartTimeMillis) { + final long e2eRequestLatencyMillis = + SystemClock.elapsedRealtime() - request.getRequestTime(); + final long requestOverheadMillis = + executionStartTimeMillis > 0 ? (executionStartTimeMillis - request.getRequestTime()) + : e2eRequestLatencyMillis; + LOGGING_THREAD_EXECUTOR.execute(() -> AppFunctionsStatsLog.write( + AppFunctionsStatsLog.APP_FUNCTIONS_REQUEST_REPORTED, + /* callerPackageUid= */ callingUid, + /* targetPackageUid= */ + getPackageUid(request.getClientRequest().getTargetPackageName()), + /* errorCode= */ errorCode, + /* requestSizeBytes= */ request.getClientRequest().getRequestDataSize(), + /* responseSizeBytes= */ responseSizeBytes, + /* requestDurationMs= */ e2eRequestLatencyMillis, + /* requestOverheadMs= */ requestOverheadMillis) + ); + } + + private int getPackageUid(String packageName) { + try { + return mContext.getPackageManager().getPackageUid(packageName, 0); + } catch (PackageManager.NameNotFoundException e) { + Slog.e(TAG, "Package uid not found for " + packageName); + } + return 0; + } +} diff --git a/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java b/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java index c689bb92f8f7..a5ae7e310022 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java +++ b/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java @@ -16,8 +16,8 @@ package com.android.server.appfunctions; import android.annotation.NonNull; -import android.app.appfunctions.ExecuteAppFunctionAidlRequest; import android.app.appfunctions.AppFunctionException; +import android.app.appfunctions.ExecuteAppFunctionAidlRequest; import android.app.appfunctions.ExecuteAppFunctionResponse; import android.app.appfunctions.IAppFunctionService; import android.app.appfunctions.ICancellationCallback; @@ -52,6 +52,7 @@ public class RunAppFunctionServiceCallback implements RunServiceCallCallback<IAp @NonNull IAppFunctionService service, @NonNull ServiceUsageCompleteListener serviceUsageCompleteListener) { try { + mSafeExecuteAppFunctionCallback.setExecutionStartTimeMillis(); service.executeAppFunction( mRequestInternal.getClientRequest(), mRequestInternal.getCallingPackage(), diff --git a/services/autofill/bugfixes.aconfig b/services/autofill/bugfixes.aconfig index 9c83757f4b0f..65c446ee6fa8 100644 --- a/services/autofill/bugfixes.aconfig +++ b/services/autofill/bugfixes.aconfig @@ -86,3 +86,23 @@ flag { description: "Highlight single field after autofill selection" bug: "41496744" } + +flag { + name: "metrics_fixes" + namespace: "autofill" + description: "Fixes various framework reported metrics" + bug: "362581326, 363011343" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + name: "add_accessibility_title_for_augmented_autofill_dropdown" + namespace: "autofill" + description: "Add accessibility title for augmented autofill dropdown" + bug: "375284244" + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java index bd1b0ea99e17..6ccf5e47ca6c 100644 --- a/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java +++ b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java @@ -45,6 +45,7 @@ import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_ import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_NO_FOCUS; import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_REQUEST_TIMEOUT; import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT; import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON; import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED; import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUSED_BEFORE_FILL_DIALOG_RESPONSE; @@ -98,6 +99,7 @@ public final class PresentationStatsEventLogger { NOT_SHOWN_REASON_REQUEST_FAILED, NOT_SHOWN_REASON_NO_FOCUS, NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY, + NOT_SHOWN_REASON_SUGGESTION_FILTERED, NOT_SHOWN_REASON_UNKNOWN }) @Retention(RetentionPolicy.SOURCE) @@ -178,6 +180,8 @@ public final class PresentationStatsEventLogger { AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY; public static final int NOT_SHOWN_REASON_UNKNOWN = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON; + public static final int NOT_SHOWN_REASON_SUGGESTION_FILTERED = + AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT; public static final int AUTHENTICATION_TYPE_UNKNOWN = AUTOFILL_PRESENTATION_EVENT_REPORTED__AUTHENTICATION_TYPE__AUTHENTICATION_TYPE_UNKNOWN; @@ -286,12 +290,43 @@ public final class PresentationStatsEventLogger { }); } + /** + * Call this when first entering the View. It will check if there are pre-existing characters + * in the view, and sets NOT_SHOWN_REASON_SUGGESTION_FILTERED if there is + */ + public void maybeSetNoPresentationEventReasonSuggestionsFiltered(AutofillValue value) { + mEventInternal.ifPresent( + event -> { + if (value == null || !value.isText()) { + return; + } + + int length = value.getTextValue().length(); + + if (length > 0) { + maybeSetNoPresentationEventReason(NOT_SHOWN_REASON_SUGGESTION_FILTERED); + } + }); + } + public void maybeSetNoPresentationEventReasonIfNoReasonExists(@NotShownReason int reason) { - mEventInternal.ifPresent(event -> { - if (event.mCountShown == 0 && event.mNoPresentationReason == NOT_SHOWN_REASON_UNKNOWN) { - event.mNoPresentationReason = reason; - } - }); + mEventInternal.ifPresent( + event -> { + if (event.mCountShown != 0) { + return; + } + + // The only events that can be overwritten. + // NOT_SHOWN_REASON_UNKNOWN is the default for inline/dropdown + // NOT_SHOWN_REASON_NO_FOCUS is the default for fill dialog + if (event.mNoPresentationReason != NOT_SHOWN_REASON_UNKNOWN + || event.mNoPresentationReason != NOT_SHOWN_REASON_NO_FOCUS) { + Slog.d(TAG, "Not setting no presentation reason because it already exists"); + return; + } + + event.mNoPresentationReason = reason; + }); } public void maybeSetAvailableCount(@Nullable List<Dataset> datasetList, diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 9c6e4741730a..ba9865d513d7 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -41,6 +41,7 @@ import static android.service.autofill.FillRequest.FLAG_VIEW_REQUESTS_CREDMAN_SE import static android.service.autofill.FillRequest.INVALID_REQUEST_ID; import static android.service.autofill.Flags.highlightAutofillSingleField; import static android.service.autofill.Flags.improveFillDialogAconfig; +import static android.service.autofill.Flags.metricsFixes; import static android.view.autofill.AutofillManager.ACTION_RESPONSE_EXPIRED; import static android.view.autofill.AutofillManager.ACTION_START_SESSION; import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED; @@ -3741,8 +3742,13 @@ final class Session final FillResponse lastResponse = getLastResponseLocked("logContextCommited(%s)"); if (lastResponse == null) return; - mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( - PresentationStatsEventLogger.getNoPresentationEventReason(commitReason)); + if (metricsFixes()) { + mPresentationStatsEventLogger.maybeSetNoPresentationEventReasonIfNoReasonExists( + PresentationStatsEventLogger.getNoPresentationEventReason(commitReason)); + } else { + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + PresentationStatsEventLogger.getNoPresentationEventReason(commitReason)); + } mPresentationStatsEventLogger.logAndEndEvent("Context committed"); final int flags = lastResponse.getFlags(); @@ -5125,6 +5131,13 @@ final class Session mPreviouslyFillDialogPotentiallyStarted = false; } else { mPreviouslyFillDialogPotentiallyStarted = true; + if (metricsFixes()) { + // Set the default reason for now if the user doesn't trigger any focus + // event on the autofillable view. This can be changed downstream when + // more information is available or session is committed. + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + NOT_SHOWN_REASON_NO_FOCUS); + } } Optional<Integer> maybeRequestId = requestNewFillResponseLocked( @@ -5291,6 +5304,10 @@ final class Session if (maybeNewRequestId.isPresent()) { mPresentationStatsEventLogger.maybeSetRequestId(maybeNewRequestId.get()); } + if (metricsFixes()) { + mPresentationStatsEventLogger + .maybeSetNoPresentationEventReasonSuggestionsFiltered(value); + } } logPresentationStatsOnViewEnteredLocked( @@ -5325,8 +5342,14 @@ final class Session // It's not necessary that there's no more presentation for this view. It could // be that the user chose some suggestion, in which case, view exits. - mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( - NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED); + if (metricsFixes()) { + mPresentationStatsEventLogger + .maybeSetNoPresentationEventReasonIfNoReasonExists( + NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED); + } else { + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED); + } } break; default: @@ -6935,11 +6958,15 @@ final class Session private void startNewEventForPresentationStatsEventLogger() { synchronized (mLock) { mPresentationStatsEventLogger.startNewEvent(); - // Set the default reason for now if the user doesn't trigger any focus event - // on the autofillable view. This can be changed downstream when more - // information is available or session is committed. - mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( - NOT_SHOWN_REASON_NO_FOCUS); + // This is a fill dialog only state, moved to when we set + // mPreviouslyFillDialogPotentiallyStarted = true + if (!metricsFixes()) { + // Set the default reason for now if the user doesn't trigger any focus event + // on the autofillable view. This can be changed downstream when more + // information is available or session is committed. + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + NOT_SHOWN_REASON_NO_FOCUS); + } mPresentationStatsEventLogger.maybeSetDetectionPreference( getDetectionPreferenceForLogging()); mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid()); @@ -7696,7 +7723,11 @@ final class Session if (sVerbose) { Slog.v(TAG, "logAllEvents(" + id + "): commitReason: " + val); } - mSessionCommittedEventLogger.maybeSetCommitReason(val); + if (metricsFixes()) { + mSessionCommittedEventLogger.maybeSetCommitReasonIfUnset(val); + } else { + mSessionCommittedEventLogger.maybeSetCommitReason(val); + } mSessionCommittedEventLogger.maybeSetRequestCount(mRequestCount); mSessionCommittedEventLogger.maybeSetSessionDurationMillis( SystemClock.elapsedRealtime() - mStartTime); diff --git a/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java b/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java index 8f3c8803154d..7fd5648156a8 100644 --- a/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java +++ b/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java @@ -76,6 +76,17 @@ public final class SessionCommittedEventLogger { }); } + /** Set commit_reason if not already set */ + public void maybeSetCommitReasonIfUnset(@AutofillCommitReason int val) { + mEventInternal.ifPresent( + event -> { + if (event.mCommitReason != COMMIT_REASON_UNKNOWN) { + return; + } + event.mCommitReason = val; + }); + } + /** * Set session_duration_millis as long as mEventInternal presents. */ diff --git a/services/companion/java/com/android/server/companion/utils/MetricUtils.java b/services/companion/java/com/android/server/companion/utils/MetricUtils.java index 8ea5c89116eb..83cbde6639c0 100644 --- a/services/companion/java/com/android/server/companion/utils/MetricUtils.java +++ b/services/companion/java/com/android/server/companion/utils/MetricUtils.java @@ -21,6 +21,7 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PRO import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER; import static android.companion.AssociationRequest.DEVICE_PROFILE_GLASSES; import static android.companion.AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; +import static android.companion.AssociationRequest.DEVICE_PROFILE_SENSOR_DEVICE_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION; @@ -31,6 +32,7 @@ import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_COMPUTER; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_GLASSES; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; +import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_SENSOR_DEVICE_STREAMING; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_NULL; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_WATCH; import static com.android.internal.util.FrameworkStatsLog.write; @@ -71,6 +73,10 @@ public final class MetricUtils { DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_NEARBY_DEVICE_STREAMING ); + map.put( + DEVICE_PROFILE_SENSOR_DEVICE_STREAMING, + CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_SENSOR_DEVICE_STREAMING + ); METRIC_DEVICE_PROFILE = unmodifiableMap(map); } diff --git a/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java b/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java index f37e0c94caca..6431af5b21ac 100644 --- a/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java +++ b/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java @@ -28,6 +28,7 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PRO import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER; import static android.companion.AssociationRequest.DEVICE_PROFILE_GLASSES; import static android.companion.AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; +import static android.companion.AssociationRequest.DEVICE_PROFILE_SENSOR_DEVICE_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Binder.getCallingPid; @@ -75,6 +76,8 @@ public final class PermissionsUtils { map.put(DEVICE_PROFILE_GLASSES, Manifest.permission.REQUEST_COMPANION_PROFILE_GLASSES); map.put(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, Manifest.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING); + map.put(DEVICE_PROFILE_SENSOR_DEVICE_STREAMING, + Manifest.permission.REQUEST_COMPANION_PROFILE_SENSOR_DEVICE_STREAMING); DEVICE_PROFILE_TO_PERMISSION = unmodifiableMap(map); } diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java index 6729231d68ab..1f3b31692289 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java @@ -103,7 +103,8 @@ public class VirtualDeviceManagerService extends SystemService { private static final List<String> VIRTUAL_DEVICE_COMPANION_DEVICE_PROFILES = Arrays.asList( AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION, AssociationRequest.DEVICE_PROFILE_APP_STREAMING, - AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING); + AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, + AssociationRequest.DEVICE_PROFILE_SENSOR_DEVICE_STREAMING); /** Enable default device camera access for apps running on virtual devices. */ @ChangeId @@ -738,6 +739,11 @@ public class VirtualDeviceManagerService extends SystemService { public int getDevicePolicy(int deviceId, int policyType) { return mImpl.getDevicePolicy(deviceId, policyType); } + + @Override // Binder call + public int getDeviceIdForDisplayId(int displayId) { + return mImpl.getDeviceIdForDisplayId(displayId); + } } private final class LocalService extends VirtualDeviceManagerInternal { diff --git a/services/core/Android.bp b/services/core/Android.bp index b3d85f8aac48..06f9e2bf55b2 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -149,6 +149,9 @@ java_library_static { // Java/AIDL sources to be moved out to CrashRecovery module ":services-crashrecovery-sources", + + // Indicate whether VCN is in platform or mainline + ":vcn-location-sources", ], libs: [ @@ -222,7 +225,6 @@ java_library_static { "securebox", "apache-commons-math", "battery_saver_flag_lib", - "guava", "notification_flags_lib", "power_hint_flags_lib", "biometrics_flags_lib", diff --git a/services/core/java/com/android/server/GestureLauncherService.java b/services/core/java/com/android/server/GestureLauncherService.java index d84a892e4f54..ccc44a41759b 100644 --- a/services/core/java/com/android/server/GestureLauncherService.java +++ b/services/core/java/com/android/server/GestureLauncherService.java @@ -16,14 +16,9 @@ package com.android.server; -import static android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap; - -import static com.android.hardware.input.Flags.overridePowerKeyBehaviorInFocusedWindow; import static com.android.internal.R.integer.config_defaultMinEmergencyGestureTapDurationMillis; import android.app.ActivityManager; -import android.app.ActivityOptions; -import android.app.PendingIntent; import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -38,7 +33,6 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.TriggerEvent; import android.hardware.TriggerEventListener; -import android.os.Bundle; import android.os.Handler; import android.os.PowerManager; import android.os.PowerManager.WakeLock; @@ -47,12 +41,10 @@ import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.provider.Settings; -import android.service.quickaccesswallet.QuickAccessWalletClient; import android.util.MutableBoolean; import android.util.Slog; import android.view.KeyEvent; -import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEvent; @@ -78,8 +70,7 @@ public class GestureLauncherService extends SystemService { * Time in milliseconds in which the power button must be pressed twice so it will be considered * as a camera launch. */ - @VisibleForTesting - static final long POWER_DOUBLE_TAP_MAX_TIME_MS = 300; + @VisibleForTesting static final long CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS = 300; /** @@ -109,23 +100,10 @@ public class GestureLauncherService extends SystemService { @VisibleForTesting static final int EMERGENCY_GESTURE_POWER_BUTTON_COOLDOWN_PERIOD_MS_MAX = 5000; - /** Indicates camera should be launched on power double tap. */ - @VisibleForTesting static final int LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER = 0; - - /** Indicates wallet should be launched on power double tap. */ - @VisibleForTesting static final int LAUNCH_WALLET_ON_DOUBLE_TAP_POWER = 1; - - /** Number of taps required to launch the double tap shortcut (either camera or wallet). */ - public static final int DOUBLE_POWER_TAP_COUNT_THRESHOLD = 2; - - /** Bundle to send with PendingIntent to grant background activity start privileges. */ - private static final Bundle GRANT_BACKGROUND_START_PRIVILEGES = - ActivityOptions.makeBasic() - .setPendingIntentBackgroundActivityStartMode( - ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS) - .toBundle(); - - private final QuickAccessWalletClient mQuickAccessWalletClient; + /** + * Number of taps required to launch camera shortcut. + */ + private static final int CAMERA_POWER_TAP_COUNT_THRESHOLD = 2; /** The listener that receives the gesture event. */ private final GestureEventListener mGestureListener = new GestureEventListener(); @@ -180,9 +158,6 @@ public class GestureLauncherService extends SystemService { */ private boolean mCameraDoubleTapPowerEnabled; - /** Whether wallet double tap power button gesture is currently enabled. */ - private boolean mWalletDoubleTapPowerEnabled; - /** * Whether emergency gesture is currently enabled */ @@ -229,22 +204,14 @@ public class GestureLauncherService extends SystemService { } } public GestureLauncherService(Context context) { - this( - context, - new MetricsLogger(), - QuickAccessWalletClient.create(context), - new UiEventLoggerImpl()); + this(context, new MetricsLogger(), new UiEventLoggerImpl()); } @VisibleForTesting - public GestureLauncherService( - Context context, - MetricsLogger metricsLogger, - QuickAccessWalletClient quickAccessWalletClient, + GestureLauncherService(Context context, MetricsLogger metricsLogger, UiEventLogger uiEventLogger) { super(context); mContext = context; - mQuickAccessWalletClient = quickAccessWalletClient; mMetricsLogger = metricsLogger; mUiEventLogger = uiEventLogger; } @@ -270,9 +237,6 @@ public class GestureLauncherService extends SystemService { "GestureLauncherService"); updateCameraRegistered(); updateCameraDoubleTapPowerEnabled(); - if (launchWalletOptionOnPowerDoubleTap()) { - updateWalletDoubleTapPowerEnabled(); - } updateEmergencyGestureEnabled(); updateEmergencyGesturePowerButtonCooldownPeriodMs(); @@ -328,14 +292,6 @@ public class GestureLauncherService extends SystemService { } @VisibleForTesting - void updateWalletDoubleTapPowerEnabled() { - boolean enabled = isWalletDoubleTapPowerSettingEnabled(mContext, mUserId); - synchronized (this) { - mWalletDoubleTapPowerEnabled = enabled; - } - } - - @VisibleForTesting void updateEmergencyGestureEnabled() { boolean enabled = isEmergencyGestureSettingEnabled(mContext, mUserId); synchronized (this) { @@ -462,33 +418,10 @@ public class GestureLauncherService extends SystemService { Settings.Secure.CAMERA_GESTURE_DISABLED, 0, userId) == 0); } - /** Checks if camera should be launched on double press of the power button. */ public static boolean isCameraDoubleTapPowerSettingEnabled(Context context, int userId) { - boolean res; - - if (launchWalletOptionOnPowerDoubleTap()) { - res = isDoubleTapPowerGestureSettingEnabled(context, userId) - && getDoubleTapPowerGestureAction(context, userId) - == LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER; - } else { - // These are legacy settings that will be deprecated once the option to launch both - // wallet and camera has been created. - res = isCameraDoubleTapPowerEnabled(context.getResources()) - && (Settings.Secure.getIntForUser(context.getContentResolver(), - Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, userId) == 0); - } - return res; - } - - /** Checks if wallet should be launched on double tap of the power button. */ - public static boolean isWalletDoubleTapPowerSettingEnabled(Context context, int userId) { - if (!launchWalletOptionOnPowerDoubleTap()) { - return false; - } - - return isDoubleTapPowerGestureSettingEnabled(context, userId) - && getDoubleTapPowerGestureAction(context, userId) - == LAUNCH_WALLET_ON_DOUBLE_TAP_POWER; + return isCameraDoubleTapPowerEnabled(context.getResources()) + && (Settings.Secure.getIntForUser(context.getContentResolver(), + Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, userId) == 0); } public static boolean isCameraLiftTriggerSettingEnabled(Context context, int userId) { @@ -508,28 +441,6 @@ public class GestureLauncherService extends SystemService { isDefaultEmergencyGestureEnabled(context.getResources()) ? 1 : 0, userId) != 0; } - private static int getDoubleTapPowerGestureAction(Context context, int userId) { - return Settings.Secure.getIntForUser( - context.getContentResolver(), - Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE, - LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER, - userId); - } - - /** Whether the shortcut to launch app on power double press is enabled. */ - private static boolean isDoubleTapPowerGestureSettingEnabled(Context context, int userId) { - return Settings.Secure.getIntForUser( - context.getContentResolver(), - Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, - isDoubleTapConfigEnabled(context.getResources()) ? 1 : 0, - userId) - == 1; - } - - private static boolean isDoubleTapConfigEnabled(Resources resources) { - return resources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled); - } - /** * Gets power button cooldown period in milliseconds after emergency gesture is triggered. The * value is capped at a maximum @@ -583,56 +494,10 @@ public class GestureLauncherService extends SystemService { * Whether GestureLauncherService should be enabled according to system properties. */ public static boolean isGestureLauncherEnabled(Resources resources) { - boolean res = - isCameraLaunchEnabled(resources) - || isCameraLiftTriggerEnabled(resources) - || isEmergencyGestureEnabled(resources); - if (launchWalletOptionOnPowerDoubleTap()) { - res |= isDoubleTapConfigEnabled(resources); - } else { - res |= isCameraDoubleTapPowerEnabled(resources); - } - return res; - } - - /** - * Processes a power key event in GestureLauncherService without performing an action. This - * method is called on every KEYCODE_POWER ACTION_DOWN event and ensures that, even if - * KEYCODE_POWER events are passed to and handled by the app, the GestureLauncherService still - * keeps track of all running KEYCODE_POWER events for its gesture detection and relevant - * actions. - */ - public void processPowerKeyDown(KeyEvent event) { - if (mEmergencyGestureEnabled && mEmergencyGesturePowerButtonCooldownPeriodMs >= 0 - && event.getEventTime() - mLastEmergencyGestureTriggered - < mEmergencyGesturePowerButtonCooldownPeriodMs) { - return; - } - if (event.isLongPress()) { - return; - } - - final long powerTapInterval; - - synchronized (this) { - powerTapInterval = event.getEventTime() - mLastPowerDown; - mLastPowerDown = event.getEventTime(); - if (powerTapInterval >= POWER_SHORT_TAP_SEQUENCE_MAX_INTERVAL_MS) { - // Tap too slow, reset consecutive tap counts. - mFirstPowerDown = event.getEventTime(); - mPowerButtonConsecutiveTaps = 1; - mPowerButtonSlowConsecutiveTaps = 1; - } else if (powerTapInterval >= POWER_DOUBLE_TAP_MAX_TIME_MS) { - // Tap too slow for shortcuts - mFirstPowerDown = event.getEventTime(); - mPowerButtonConsecutiveTaps = 1; - mPowerButtonSlowConsecutiveTaps++; - } else if (powerTapInterval > 0) { - // Fast consecutive tap - mPowerButtonConsecutiveTaps++; - mPowerButtonSlowConsecutiveTaps++; - } - } + return isCameraLaunchEnabled(resources) + || isCameraDoubleTapPowerEnabled(resources) + || isCameraLiftTriggerEnabled(resources) + || isEmergencyGestureEnabled(resources); } /** @@ -642,8 +507,8 @@ public class GestureLauncherService extends SystemService { * @param outLaunched true if some action is taken as part of the key intercept (eg, app launch) * @return true if the key down event is intercepted */ - public boolean interceptPowerKeyDown( - KeyEvent event, boolean interactive, MutableBoolean outLaunched) { + public boolean interceptPowerKeyDown(KeyEvent event, boolean interactive, + MutableBoolean outLaunched) { if (mEmergencyGestureEnabled && mEmergencyGesturePowerButtonCooldownPeriodMs >= 0 && event.getEventTime() - mLastEmergencyGestureTriggered < mEmergencyGesturePowerButtonCooldownPeriodMs) { @@ -665,7 +530,6 @@ public class GestureLauncherService extends SystemService { return false; } boolean launchCamera = false; - boolean launchWallet = false; boolean launchEmergencyGesture = false; boolean intercept = false; long powerTapInterval; @@ -677,12 +541,12 @@ public class GestureLauncherService extends SystemService { mFirstPowerDown = event.getEventTime(); mPowerButtonConsecutiveTaps = 1; mPowerButtonSlowConsecutiveTaps = 1; - } else if (powerTapInterval >= POWER_DOUBLE_TAP_MAX_TIME_MS) { + } else if (powerTapInterval >= CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS) { // Tap too slow for shortcuts mFirstPowerDown = event.getEventTime(); mPowerButtonConsecutiveTaps = 1; mPowerButtonSlowConsecutiveTaps++; - } else if (!overridePowerKeyBehaviorInFocusedWindow() || powerTapInterval > 0) { + } else { // Fast consecutive tap mPowerButtonConsecutiveTaps++; mPowerButtonSlowConsecutiveTaps++; @@ -722,16 +586,10 @@ public class GestureLauncherService extends SystemService { } } if (mCameraDoubleTapPowerEnabled - && powerTapInterval < POWER_DOUBLE_TAP_MAX_TIME_MS - && mPowerButtonConsecutiveTaps == DOUBLE_POWER_TAP_COUNT_THRESHOLD) { + && powerTapInterval < CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS + && mPowerButtonConsecutiveTaps == CAMERA_POWER_TAP_COUNT_THRESHOLD) { launchCamera = true; intercept = interactive; - } else if (launchWalletOptionOnPowerDoubleTap() - && mWalletDoubleTapPowerEnabled - && powerTapInterval < POWER_DOUBLE_TAP_MAX_TIME_MS - && mPowerButtonConsecutiveTaps == DOUBLE_POWER_TAP_COUNT_THRESHOLD) { - launchWallet = true; - intercept = interactive; } } if (mPowerButtonConsecutiveTaps > 1 || mPowerButtonSlowConsecutiveTaps > 1) { @@ -750,10 +608,6 @@ public class GestureLauncherService extends SystemService { (int) powerTapInterval); mUiEventLogger.log(GestureLauncherEvent.GESTURE_CAMERA_DOUBLE_TAP_POWER); } - } else if (launchWallet) { - Slog.i(TAG, "Power button double tap gesture detected, launching wallet. Interval=" - + powerTapInterval + "ms"); - launchWallet = sendGestureTargetActivityPendingIntent(); } else if (launchEmergencyGesture) { Slog.i(TAG, "Emergency gesture detected, launching."); launchEmergencyGesture = handleEmergencyGesture(); @@ -769,74 +623,11 @@ public class GestureLauncherService extends SystemService { mPowerButtonSlowConsecutiveTaps); mMetricsLogger.histogram("power_double_tap_interval", (int) powerTapInterval); - outLaunched.value = launchCamera || launchEmergencyGesture || launchWallet; + outLaunched.value = launchCamera || launchEmergencyGesture; // Intercept power key event if the press is part of a gesture (camera, eGesture) and the // user has completed setup. return intercept && isUserSetupComplete(); } - - /** - * Fetches and sends gestureTargetActivityPendingIntent from QuickAccessWallet, which is a - * specific activity that QuickAccessWalletService has defined to be launch on detection of the - * power button gesture. - */ - private boolean sendGestureTargetActivityPendingIntent() { - boolean userSetupComplete = isUserSetupComplete(); - if (mQuickAccessWalletClient == null - || !mQuickAccessWalletClient.isWalletServiceAvailable()) { - Slog.w(TAG, "QuickAccessWalletService is not available, ignoring wallet gesture."); - return false; - } - - if (!userSetupComplete) { - if (DBG) { - Slog.d(TAG, "userSetupComplete = false, ignoring wallet gesture."); - } - return false; - } - if (DBG) { - Slog.d(TAG, "userSetupComplete = true, performing wallet gesture."); - } - - mQuickAccessWalletClient.getGestureTargetActivityPendingIntent( - getContext().getMainExecutor(), - gesturePendingIntent -> { - if (gesturePendingIntent == null) { - Slog.d(TAG, "getGestureTargetActivityPendingIntent is null."); - sendFallbackPendingIntent(); - return; - } - sendPendingIntentWithBackgroundStartPrivileges(gesturePendingIntent); - }); - return true; - } - - /** - * If gestureTargetActivityPendingIntent is null, this method is invoked to start the activity - * that QuickAccessWalletService has defined to host the Wallet view, which is typically the - * home screen of the Wallet application. - */ - private void sendFallbackPendingIntent() { - mQuickAccessWalletClient.getWalletPendingIntent( - getContext().getMainExecutor(), - walletPendingIntent -> { - if (walletPendingIntent == null) { - Slog.w(TAG, "getWalletPendingIntent returns null. Not launching " - + "anything for wallet."); - return; - } - sendPendingIntentWithBackgroundStartPrivileges(walletPendingIntent); - }); - } - - private void sendPendingIntentWithBackgroundStartPrivileges(PendingIntent pendingIntent) { - try { - pendingIntent.send(GRANT_BACKGROUND_START_PRIVILEGES); - } catch (PendingIntent.CanceledException e) { - Slog.e(TAG, "PendingIntent was canceled", e); - } - } - /** * @return true if camera was launched, false otherwise. */ @@ -909,39 +700,31 @@ public class GestureLauncherService extends SystemService { Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0; } - private final BroadcastReceiver mUserReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { - mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); - mContext.getContentResolver().unregisterContentObserver(mSettingObserver); - registerContentObservers(); - updateCameraRegistered(); - updateCameraDoubleTapPowerEnabled(); - if (launchWalletOptionOnPowerDoubleTap()) { - updateWalletDoubleTapPowerEnabled(); - } - updateEmergencyGestureEnabled(); - updateEmergencyGesturePowerButtonCooldownPeriodMs(); - } - } - }; - - private final ContentObserver mSettingObserver = - new ContentObserver(new Handler()) { - public void onChange(boolean selfChange, android.net.Uri uri, int userId) { - if (userId == mUserId) { - updateCameraRegistered(); - updateCameraDoubleTapPowerEnabled(); - if (launchWalletOptionOnPowerDoubleTap()) { - updateWalletDoubleTapPowerEnabled(); - } - updateEmergencyGestureEnabled(); - updateEmergencyGesturePowerButtonCooldownPeriodMs(); - } - } - }; + private final BroadcastReceiver mUserReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { + mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); + mContext.getContentResolver().unregisterContentObserver(mSettingObserver); + registerContentObservers(); + updateCameraRegistered(); + updateCameraDoubleTapPowerEnabled(); + updateEmergencyGestureEnabled(); + updateEmergencyGesturePowerButtonCooldownPeriodMs(); + } + } + }; + + private final ContentObserver mSettingObserver = new ContentObserver(new Handler()) { + public void onChange(boolean selfChange, android.net.Uri uri, int userId) { + if (userId == mUserId) { + updateCameraRegistered(); + updateCameraDoubleTapPowerEnabled(); + updateEmergencyGestureEnabled(); + updateEmergencyGesturePowerButtonCooldownPeriodMs(); + } + } + }; private final class GestureEventListener implements SensorEventListener { @Override diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index 8da835896bd3..96bdbb80ad9b 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -119,6 +119,10 @@ "include-filter": "android.os.storage.cts.StorageStatsManagerTest" } ] + }, + { + "name": "FrameworksMockingServicesTests_service_batteryServiceTest", + "file_patterns": ["BatteryService\\.java"] } ], "presubmit-large": [ @@ -176,10 +180,6 @@ "include-filter": "com.android.server.wm.BackgroundActivityStart*" } ] - }, - { - "name": "FrameworksMockingServicesTests_service_batteryServiceTest", - "file_patterns": ["BatteryService\\.java"] } ] } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index c27126a01a32..aea24d978bee 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -1101,6 +1101,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub /** StatsPullAtomCallback for pulling BatteryUsageStats data. */ private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback { + private static final long BATTERY_USAGE_STATS_PER_UID_MAX_STATS_AGE = + TimeUnit.HOURS.toMillis(2); + @Override public int onPullAtom(int atomTag, List<StatsEvent> data) { final BatteryUsageStats bus; @@ -1168,7 +1171,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub .setMinConsumedPowerThreshold(minConsumedPowerThreshold); if (isBatteryUsageStatsAccumulationSupported()) { - query.accumulated(); + query.accumulated() + .setMaxStatsAgeMs(BATTERY_USAGE_STATS_PER_UID_MAX_STATS_AGE); } bus = getBatteryUsageStats(List.of(query.build())).get(0); diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index 883e09f53e41..87f87c76725e 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -143,6 +143,7 @@ public class SettingsToPropertiesMapper { "tv_os", "aaos_carframework_triage", "aaos_performance_triage", + "aaos_input_triage", "aaos_user_triage", "aaos_window_triage", "aaos_audio_triage", diff --git a/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java b/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java index fa2e674d37c7..ca9a25b86aed 100644 --- a/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java +++ b/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java @@ -28,6 +28,7 @@ import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_FOREGROUND; import static android.app.AppOpsManager.MODE_IGNORED; import static android.app.AppOpsManager.OP_CAMERA; +import static android.app.AppOpsManager.OP_CONTROL_AUDIO; import static android.app.AppOpsManager.OP_NONE; import static android.app.AppOpsManager.OP_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO; import static android.app.AppOpsManager.OP_RECORD_AUDIO; @@ -176,6 +177,8 @@ class AppOpsUidStateTrackerImpl implements AppOpsUidStateTracker { case OP_RECORD_AUDIO: case OP_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO: return PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; + case OP_CONTROL_AUDIO: + return PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL; default: return PROCESS_CAPABILITY_NONE; } diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index 34d4fb02ad99..acb46d9b85e6 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -793,6 +793,7 @@ public class AudioDeviceInventory { * (see AudioService.onAudioServerDied() method) */ // Always executed on AudioDeviceBroker message queue + @GuardedBy("mDeviceBroker.mDeviceStateLock") /*package*/ void onRestoreDevices() { synchronized (mDevicesLock) { int res; @@ -815,6 +816,9 @@ public class AudioDeviceInventory { "Device inventory restore failed to reconnect " + di, EventLogger.Event.ALOGE, TAG); mConnectedDevices.remove(di.getKey(), di); + if (AudioSystem.isBluetoothScoDevice(di.mDeviceType)) { + mDeviceBroker.onSetBtScoActiveDevice(null); + } } } mAppliedStrategyRolesInt.clear(); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 09b8e212bfad..1799b7715e5c 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -4177,6 +4177,12 @@ public class AudioService extends IAudioService.Stub // Stream mute changed, fire the intent. Intent intent = new Intent(AudioManager.STREAM_MUTE_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_STREAM_VOLUME_MUTED, isMuted); + if (replaceStreamBtSco() && isStreamBluetoothSco(streamType)) { + intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, + AudioSystem.STREAM_BLUETOOTH_SCO); + // in this case broadcast for both sco and voice_call streams the mute status + sendBroadcastToAll(intent, null /* options */); + } intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, streamType); sendBroadcastToAll(intent, null /* options */); } @@ -9670,9 +9676,16 @@ public class AudioService extends IAudioService.Stub mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, index); mVolumeChanged.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, oldIndex); - - mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, - mStreamType); + int extraStreamType = mStreamType; + // TODO: remove this when deprecating STREAM_BLUETOOTH_SCO + if (isStreamBluetoothSco(mStreamType)) { + mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, + AudioSystem.STREAM_BLUETOOTH_SCO); + extraStreamType = AudioSystem.STREAM_BLUETOOTH_SCO; + } else { + mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, + mStreamType); + } mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE_ALIAS, streamAlias); @@ -9683,9 +9696,21 @@ public class AudioService extends IAudioService.Stub " aliased streams: " + aliasStreamIndexes; } AudioService.sVolumeLogger.enqueue(new VolChangedBroadcastEvent( - mStreamType, aliasStreamIndexesString, index, oldIndex)); + extraStreamType, aliasStreamIndexesString, index, oldIndex)); + if (extraStreamType != mStreamType) { + AudioService.sVolumeLogger.enqueue(new VolChangedBroadcastEvent( + mStreamType, aliasStreamIndexesString, index, oldIndex)); + } } sendBroadcastToAll(mVolumeChanged, mVolumeChangedOptions); + if (extraStreamType != mStreamType) { + // send multiple intents in case we merged voice call and bt sco streams + mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, + mStreamType); + // do not use the options in thid case which could discard + // the previous intent + sendBroadcastToAll(mVolumeChanged, null); + } } } } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 452dc5f97d12..0b633bd9c549 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -2042,7 +2042,7 @@ public final class DisplayManagerService extends SystemService { // handles stopping the projection. Slog.w(TAG, "Content Recording: failed to start mirroring - " + "releasing virtual display " + displayId); - releaseVirtualDisplayInternal(callback.asBinder(), callingUid); + releaseVirtualDisplayInternal(callback.asBinder()); return Display.INVALID_DISPLAY; } else if (projection != null) { // Indicate that this projection has been used to record, and can't be used @@ -2131,7 +2131,7 @@ public final class DisplayManagerService extends SystemService { // Something weird happened and the logical display was not created. Slog.w(TAG, "Rejecting request to create virtual display " + "because the logical display was not created."); - mVirtualDisplayAdapter.releaseVirtualDisplayLocked(callback.asBinder(), callingUid); + mVirtualDisplayAdapter.releaseVirtualDisplayLocked(callback.asBinder()); mDisplayDeviceRepo.onDisplayDeviceEvent(device, DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED); return -1; @@ -2158,14 +2158,14 @@ public final class DisplayManagerService extends SystemService { } } - private void releaseVirtualDisplayInternal(IBinder appToken, int callingUid) { + private void releaseVirtualDisplayInternal(IBinder appToken) { synchronized (mSyncRoot) { if (mVirtualDisplayAdapter == null) { return; } DisplayDevice device = - mVirtualDisplayAdapter.releaseVirtualDisplayLocked(appToken, callingUid); + mVirtualDisplayAdapter.releaseVirtualDisplayLocked(appToken); Slog.d(TAG, "Virtual Display: Display Device released"); if (device != null) { // TODO: multi-display - handle virtual displays the same as other display adapters. @@ -4789,10 +4789,9 @@ public final class DisplayManagerService extends SystemService { @Override // Binder call public void releaseVirtualDisplay(IVirtualDisplayCallback callback) { - final int callingUid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { - releaseVirtualDisplayInternal(callback.asBinder(), callingUid); + releaseVirtualDisplayInternal(callback.asBinder()); } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 945365dcf8fe..f48fbea64f65 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -906,6 +906,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLogicalDisplay.getPowerThrottlingDataIdLocked(); mHandler.postAtTime(() -> { + if (mStopped) { + // DPC has already stopped, don't execute any more. + return; + } + boolean changed = false; if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) { @@ -3306,7 +3311,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call int displayId, SensorManager sensorManager) { return new DisplayPowerProximityStateController(wakelockController, displayDeviceConfig, looper, nudgeUpdatePowerState, - displayId, sensorManager, /* injector= */ null); + displayId, sensorManager); } AutomaticBrightnessController getAutomaticBrightnessController( diff --git a/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java b/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java index 215932ca19be..35455c841c7b 100644 --- a/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java +++ b/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java @@ -16,6 +16,8 @@ package com.android.server.display; +import android.annotation.IntDef; +import android.annotation.Nullable; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; @@ -34,6 +36,8 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.utils.SensorUtils; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * Maintains the proximity state of the display. @@ -42,18 +46,26 @@ import java.io.PrintWriter; */ public final class DisplayPowerProximityStateController { @VisibleForTesting - static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 1; - @VisibleForTesting static final int PROXIMITY_UNKNOWN = -1; + private static final int PROXIMITY_NEGATIVE = 0; @VisibleForTesting static final int PROXIMITY_POSITIVE = 1; + + @IntDef(prefix = { "PROXIMITY_" }, value = { + PROXIMITY_UNKNOWN, + PROXIMITY_NEGATIVE, + PROXIMITY_POSITIVE + }) + @Retention(RetentionPolicy.SOURCE) + @interface ProximityState {} + + @VisibleForTesting + static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 1; @VisibleForTesting static final int PROXIMITY_SENSOR_POSITIVE_DEBOUNCE_DELAY = 0; private static final int MSG_IGNORE_PROXIMITY = 2; - private static final int PROXIMITY_NEGATIVE = 0; - private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = false; // Proximity sensor debounce delay in milliseconds for positive transitions. @@ -73,7 +85,7 @@ public final class DisplayPowerProximityStateController { private final DisplayPowerProximityStateHandler mHandler; // A runnable to execute the utility to update the power state. private final Runnable mNudgeUpdatePowerState; - private Clock mClock; + private final Clock mClock; // A listener which listen's to the events emitted by the proximity sensor. private final SensorEventListener mProximitySensorListener = new SensorEventListener() { @Override @@ -117,9 +129,6 @@ public final class DisplayPowerProximityStateController { // with the sensor manager. private boolean mProximitySensorEnabled; - // The raw non-debounced proximity sensor state. - private int mPendingProximity = PROXIMITY_UNKNOWN; - // -1 if fully debounced. Else, represents the time in ms when the debounce suspend blocker will // be removed. Applies for both positive and negative proximity flips. private long mPendingProximityDebounceTime = -1; @@ -128,8 +137,11 @@ public final class DisplayPowerProximityStateController { // When the screen turns on again, we report user activity to the power manager. private boolean mScreenOffBecauseOfProximity; + // The raw non-debounced proximity sensor state. + private @ProximityState int mPendingProximity = PROXIMITY_UNKNOWN; + // The debounced proximity sensor state. - private int mProximity = PROXIMITY_UNKNOWN; + private @ProximityState int mProximity = PROXIMITY_UNKNOWN; // The actual proximity sensor threshold value. private float mProximityThreshold; @@ -139,7 +151,7 @@ public final class DisplayPowerProximityStateController { private boolean mSkipRampBecauseOfProximityChangeToNegative = false; // The DisplayId of the associated Logical Display. - private int mDisplayId; + private final int mDisplayId; /** * Create a new instance of DisplayPowerProximityStateController. @@ -152,11 +164,18 @@ public final class DisplayPowerProximityStateController { * @param displayId The DisplayId of the associated Logical Display. * @param sensorManager The manager which lets us access the display's ProximitySensor */ - public DisplayPowerProximityStateController( - WakelockController wakeLockController, DisplayDeviceConfig displayDeviceConfig, - Looper looper, + public DisplayPowerProximityStateController(WakelockController wakeLockController, + DisplayDeviceConfig displayDeviceConfig, Looper looper, + Runnable nudgeUpdatePowerState, int displayId, SensorManager sensorManager) { + this(wakeLockController, displayDeviceConfig, looper, nudgeUpdatePowerState, displayId, + sensorManager, new Injector()); + } + + @VisibleForTesting + DisplayPowerProximityStateController(WakelockController wakeLockController, + DisplayDeviceConfig displayDeviceConfig, Looper looper, Runnable nudgeUpdatePowerState, int displayId, SensorManager sensorManager, - Injector injector) { + @Nullable Injector injector) { if (injector == null) { injector = new Injector(); } @@ -437,7 +456,7 @@ public final class DisplayPowerProximityStateController { if (mProximity != mPendingProximity) { // if the status of the sensor changed, stop ignoring. mIgnoreProximityUntilChanged = false; - Slog.i(mTag, "No longer ignoring proximity [" + mPendingProximity + "]"); + Slog.i(mTag, "Applying proximity: " + proximityToString(mPendingProximity)); } // Sensor reading accepted. Apply the change then release the wake lock. mProximity = mPendingProximity; @@ -478,7 +497,7 @@ public final class DisplayPowerProximityStateController { } } - private String proximityToString(int state) { + private String proximityToString(@ProximityState int state) { switch (state) { case PROXIMITY_UNKNOWN: return "Unknown"; @@ -518,12 +537,12 @@ public final class DisplayPowerProximityStateController { } @VisibleForTesting - int getPendingProximity() { + @ProximityState int getPendingProximity() { return mPendingProximity; } @VisibleForTesting - int getProximity() { + @ProximityState int getProximity() { return mProximity; } @@ -550,7 +569,7 @@ public final class DisplayPowerProximityStateController { @VisibleForTesting static class Injector { Clock createClock() { - return () -> SystemClock.uptimeMillis(); + return SystemClock::uptimeMillis; } } } diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java index c0903a9bafac..79592a656409 100644 --- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java +++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java @@ -506,9 +506,6 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { return; } - Slog.i(TAG, "Requesting Transition to state: " + state.getIdentifier() + ", from state=" - + mDeviceState.getIdentifier() + ", interactive=" + mInteractive - + ", mBootCompleted=" + mBootCompleted); // As part of a state transition, we may need to turn off some displays temporarily so that // the transition is smooth. Plus, on some devices, only one internal displays can be // on at a time. We use LogicalDisplay.setIsInTransition to mark a display that needs to be @@ -522,6 +519,11 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { final boolean sleepDevice = shouldDeviceBePutToSleep(mPendingDeviceState, mDeviceState, mInteractive, mBootCompleted); + Slog.i(TAG, "Requesting Transition to state: " + state.getIdentifier() + ", from state=" + + mDeviceState.getIdentifier() + ", interactive=" + mInteractive + + ", mBootCompleted=" + mBootCompleted + ", wakeDevice=" + wakeDevice + + ", sleepDevice=" + sleepDevice); + // If all displays are off already, we can just transition here, unless we are trying to // wake or sleep the device as part of this transition. In that case defer the final // transition until later once the device is awake/asleep. diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java index 836f4ede8f57..f14e452ab8d3 100644 --- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java +++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java @@ -91,6 +91,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter { private final ArrayMap<IBinder, VirtualDisplayDevice> mVirtualDisplayDevices = new ArrayMap<>(); + // When a virtual display is created, the mapping (appToken -> ownerUid) is stored here. That + // way, when the display is released later, we can retrieve the ownerUid and decrement + // the number of virtual displays that exist for that ownerUid. We can't use + // Binder.getCallingUid() because the display might be released by the system process and not + // the process that created the display. + private final ArrayMap<IBinder, Integer> mOwnerUids = new ArrayMap<>(); + private final int mMaxDevices; private final int mMaxDevicesPerPackage; private final SparseIntArray mNoOfDevicesPerPackage = new SparseIntArray(); @@ -194,6 +201,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter { mVirtualDisplayDevices.put(appToken, device); if (getFeatureFlags().isVirtualDisplayLimitEnabled()) { mNoOfDevicesPerPackage.put(ownerUid, noOfDevices + 1); + mOwnerUids.put(appToken, ownerUid); } try { @@ -205,7 +213,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter { appToken.linkToDeath(device, 0); } catch (RemoteException ex) { Slog.e(TAG, "Virtual Display: error while setting up VirtualDisplayDevice", ex); - removeVirtualDisplayDeviceLocked(appToken, ownerUid); + removeVirtualDisplayDeviceLocked(appToken); device.destroyLocked(false); return null; } @@ -252,12 +260,10 @@ public class VirtualDisplayAdapter extends DisplayAdapter { /** * Release a virtual display that was previously created * @param appToken The token to identify the display - * @param ownerUid The UID of the package, used to keep track of and limit the number of - * displays created per package * @return The display device that has been removed */ - public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken, int ownerUid) { - VirtualDisplayDevice device = removeVirtualDisplayDeviceLocked(appToken, ownerUid); + public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken) { + VirtualDisplayDevice device = removeVirtualDisplayDeviceLocked(appToken); if (device != null) { Slog.v(TAG, "Release VirtualDisplay " + device.mName); device.destroyLocked(true); @@ -299,11 +305,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter { } } - private VirtualDisplayDevice removeVirtualDisplayDeviceLocked(IBinder appToken, int ownerUid) { - int noOfDevices = mNoOfDevicesPerPackage.get(ownerUid, /* valueIfKeyNotFound= */ 0); + private VirtualDisplayDevice removeVirtualDisplayDeviceLocked(IBinder appToken) { if (getFeatureFlags().isVirtualDisplayLimitEnabled()) { + int ownerUid = mOwnerUids.get(appToken); + int noOfDevices = mNoOfDevicesPerPackage.get(ownerUid, /* valueIfKeyNotFound= */ 0); if (noOfDevices <= 1) { mNoOfDevicesPerPackage.delete(ownerUid); + mOwnerUids.remove(appToken); } else { mNoOfDevicesPerPackage.put(ownerUid, noOfDevices - 1); } @@ -378,7 +386,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter { @Override public void binderDied() { synchronized (getSyncRoot()) { - removeVirtualDisplayDeviceLocked(mAppToken, mOwnerUid); + removeVirtualDisplayDeviceLocked(mAppToken); Slog.i(TAG, "Virtual display device released because application token died: " + mOwnerPackageName); destroyLocked(false); diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java index 585fc44fa452..78bd41bd2e11 100644 --- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java @@ -93,6 +93,10 @@ public class DisplayManagerFlags { com.android.graphics.surfaceflinger.flags.Flags.FLAG_ENABLE_SMALL_AREA_DETECTION, com.android.graphics.surfaceflinger.flags.Flags::enableSmallAreaDetection); + private final FlagState mDisplayConfigErrorHalFlagState = new FlagState( + com.android.graphics.surfaceflinger.flags.Flags.FLAG_DISPLAY_CONFIG_ERROR_HAL, + com.android.graphics.surfaceflinger.flags.Flags::displayConfigErrorHal); + private final FlagState mBrightnessIntRangeUserPerceptionFlagState = new FlagState( Flags.FLAG_BRIGHTNESS_INT_RANGE_USER_PERCEPTION, Flags::brightnessIntRangeUserPerception); @@ -361,6 +365,10 @@ public class DisplayManagerFlags { return mSmallAreaDetectionFlagState.isEnabled(); } + public boolean isDisplayConfigErrorHalEnabled() { + return mDisplayConfigErrorHalFlagState.isEnabled(); + } + public boolean isBrightnessIntRangeUserPerceptionEnabled() { return mBrightnessIntRangeUserPerceptionFlagState.isEnabled(); } @@ -591,6 +599,7 @@ public class DisplayManagerFlags { pw.println(" " + mPowerThrottlingClamperFlagState); pw.println(" " + mEvenDimmerFlagState); pw.println(" " + mSmallAreaDetectionFlagState); + pw.println(" " + mDisplayConfigErrorHalFlagState); pw.println(" " + mBrightnessIntRangeUserPerceptionFlagState); pw.println(" " + mRestrictDisplayModes); pw.println(" " + mBrightnessWearBedtimeModeClamperFlagState); diff --git a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java index 8423e1911764..02e2882442bf 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -136,6 +136,7 @@ public class DisplayModeDirector { private final ProximitySensorObserver mSensorObserver; private final HbmObserver mHbmObserver; private final SkinThermalStatusObserver mSkinThermalStatusObserver; + private final ModeChangeObserver mModeChangeObserver; @Nullable private final SystemRequestObserver mSystemRequestObserver; @@ -247,6 +248,7 @@ public class DisplayModeDirector { mDisplayObserver = new DisplayObserver(context, handler, mVotesStorage, injector); mSensorObserver = new ProximitySensorObserver(mVotesStorage, injector); mSkinThermalStatusObserver = new SkinThermalStatusObserver(injector, mVotesStorage); + mModeChangeObserver = new ModeChangeObserver(mVotesStorage, injector, handler.getLooper()); mHbmObserver = new HbmObserver(injector, mVotesStorage, BackgroundThread.getHandler(), mDeviceConfigDisplaySettings); if (displayManagerFlags.isRestrictDisplayModesEnabled()) { @@ -275,6 +277,9 @@ public class DisplayModeDirector { mSensorObserver.observe(); mHbmObserver.observe(); mSkinThermalStatusObserver.observe(); + if (mDisplayManagerFlags.isDisplayConfigErrorHalEnabled()) { + mModeChangeObserver.observe(); + } synchronized (mLock) { // We may have a listener already registered before the call to start, so go ahead and // notify them to pick up our newly initialized state. diff --git a/services/core/java/com/android/server/display/mode/ModeChangeObserver.java b/services/core/java/com/android/server/display/mode/ModeChangeObserver.java new file mode 100644 index 000000000000..bbc13cc6ae7e --- /dev/null +++ b/services/core/java/com/android/server/display/mode/ModeChangeObserver.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.display.mode; + +import android.os.Looper; +import android.util.Slog; +import android.util.SparseArray; +import android.view.Display; +import android.view.DisplayAddress; +import android.view.DisplayEventReceiver; + +import com.android.internal.annotations.KeepForWeakReference; + +import java.util.HashSet; +import java.util.Set; + +final class ModeChangeObserver { + private static final String TAG = "ModeChangeObserver"; + + private final VotesStorage mVotesStorage; + private final DisplayModeDirector.Injector mInjector; + + @SuppressWarnings("unused") + @KeepForWeakReference + private DisplayEventReceiver mModeChangeListener; + private final SparseArray<Set<Integer>> mRejectedModesByDisplay = new SparseArray<>(); + private Looper mLooper; + + ModeChangeObserver(VotesStorage votesStorage, DisplayModeDirector.Injector injector, + Looper looper) { + mVotesStorage = votesStorage; + mInjector = injector; + mLooper = looper; + } + + void observe() { + mModeChangeListener = new DisplayEventReceiver(mLooper) { + @Override + public void onModeRejected(long physicalDisplayId, int modeId) { + Slog.d(TAG, "Mode Rejected event received"); + int displayId = getLogicalDisplayId(physicalDisplayId); + if (displayId < 0) { + Slog.e(TAG, "Logical Display Id not found"); + return; + } + populateRejectedModesListByDisplay(displayId, modeId); + } + + @Override + public void onHotplug(long timestampNanos, long physicalDisplayId, boolean connected) { + Slog.d(TAG, "Hotplug event received"); + if (!connected) { + int displayId = getLogicalDisplayId(physicalDisplayId); + if (displayId < 0) { + Slog.e(TAG, "Logical Display Id not found"); + return; + } + clearRejectedModesListByDisplay(displayId); + } + } + }; + } + + private int getLogicalDisplayId(long rejectedModePhysicalDisplayId) { + Display[] displays = mInjector.getDisplays(); + + for (Display display : displays) { + DisplayAddress address = display.getAddress(); + if (address instanceof DisplayAddress.Physical physical) { + long physicalDisplayId = physical.getPhysicalDisplayId(); + if (physicalDisplayId == rejectedModePhysicalDisplayId) { + return display.getDisplayId(); + } + } + } + return -1; + } + + private void populateRejectedModesListByDisplay(int displayId, int rejectedModeId) { + Set<Integer> alreadyRejectedModes = mRejectedModesByDisplay.get(displayId); + if (alreadyRejectedModes == null) { + alreadyRejectedModes = new HashSet<>(); + mRejectedModesByDisplay.put(displayId, alreadyRejectedModes); + } + alreadyRejectedModes.add(rejectedModeId); + mVotesStorage.updateVote(displayId, Vote.PRIORITY_REJECTED_MODES, + Vote.forRejectedModes(alreadyRejectedModes)); + } + + private void clearRejectedModesListByDisplay(int displayId) { + mRejectedModesByDisplay.remove(displayId); + mVotesStorage.updateVote(displayId, Vote.PRIORITY_REJECTED_MODES, null); + } +} diff --git a/services/core/java/com/android/server/display/mode/RejectedModesVote.java b/services/core/java/com/android/server/display/mode/RejectedModesVote.java new file mode 100644 index 000000000000..db8c8527844b --- /dev/null +++ b/services/core/java/com/android/server/display/mode/RejectedModesVote.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.display.mode; + +import android.annotation.NonNull; + +import java.util.Collections; +import java.util.Set; + +public class RejectedModesVote implements Vote { + + final Set<Integer> mModeIds; + + RejectedModesVote(Set<Integer> modeIds) { + mModeIds = Collections.unmodifiableSet(modeIds); + } + @Override + public void updateSummary(@NonNull VoteSummary summary) { + summary.rejectedModeIds.addAll(mModeIds); + } + + @Override + public String toString() { + return "RejectedModesVote{ mModeIds=" + mModeIds + " }"; + } +} diff --git a/services/core/java/com/android/server/display/mode/Vote.java b/services/core/java/com/android/server/display/mode/Vote.java index f5abb0561ce7..428ccedf8760 100644 --- a/services/core/java/com/android/server/display/mode/Vote.java +++ b/services/core/java/com/android/server/display/mode/Vote.java @@ -25,6 +25,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; +import java.util.Set; interface Vote { // DEFAULT_RENDER_FRAME_RATE votes for render frame rate [0, DEFAULT]. As the lowest @@ -82,68 +83,73 @@ interface Vote { int PRIORITY_APP_REQUEST_SIZE = 7; + // PRIORITY_REJECTED_MODES rejects the modes for which the mode config failed + // so that the modeset can be retried for next available mode after filtering + // out the rejected modes for the connected display + int PRIORITY_REJECTED_MODES = 8; + // PRIORITY_USER_SETTING_PEAK_REFRESH_RATE restricts physical refresh rate to // [0, max(PEAK, MIN)], depending on user settings peakRR/minRR values - int PRIORITY_USER_SETTING_PEAK_REFRESH_RATE = 8; + int PRIORITY_USER_SETTING_PEAK_REFRESH_RATE = 9; // PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE has a higher priority than // PRIORITY_USER_SETTING_PEAK_REFRESH_RATE and will limit render rate to [0, max(PEAK, MIN)] // in case physical refresh rate vote is discarded (due to other high priority votes), // render rate vote can still apply - int PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE = 9; + int PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE = 10; // Restrict all displays physical refresh rate to 60Hz when external display is connected. // It votes [59Hz, 61Hz]. - int PRIORITY_SYNCHRONIZED_REFRESH_RATE = 10; + int PRIORITY_SYNCHRONIZED_REFRESH_RATE = 11; // PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE has a higher priority than // PRIORITY_SYNCHRONIZED_REFRESH_RATE and will limit render rate to [59Hz, 61Hz]. // In case physical refresh rate vote discarded (due to physical refresh rate not supported), // render rate vote can still apply. - int PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE = 11; + int PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE = 12; // Restrict displays max available resolution and refresh rates. It votes [0, LIMIT] - int PRIORITY_LIMIT_MODE = 12; + int PRIORITY_LIMIT_MODE = 13; // To avoid delay in switching between 60HZ -> 90HZ when activating LHBM, set refresh // rate to max value (same as for PRIORITY_UDFPS) on lock screen - int PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE = 13; + int PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE = 14; // For concurrent displays we want to limit refresh rate on all displays - int PRIORITY_LAYOUT_LIMITED_REFRESH_RATE = 14; + int PRIORITY_LAYOUT_LIMITED_REFRESH_RATE = 15; // For concurrent displays we want to limit refresh rate on all displays - int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 15; + int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 16; // For internal application to limit display modes to specific ids - int PRIORITY_SYSTEM_REQUESTED_MODES = 16; + int PRIORITY_SYSTEM_REQUESTED_MODES = 17; // PRIORITY_LOW_POWER_MODE_MODES limits display modes to specific refreshRate-vsync pairs if // Settings.Global.LOW_POWER_MODE is on. // Lower priority that PRIORITY_LOW_POWER_MODE_RENDER_RATE and if discarded (due to other // higher priority votes), render rate limit can still apply - int PRIORITY_LOW_POWER_MODE_MODES = 17; + int PRIORITY_LOW_POWER_MODE_MODES = 18; // PRIORITY_LOW_POWER_MODE_RENDER_RATE force the render frame rate to [0, 60HZ] if // Settings.Global.LOW_POWER_MODE is on. - int PRIORITY_LOW_POWER_MODE_RENDER_RATE = 18; + int PRIORITY_LOW_POWER_MODE_RENDER_RATE = 19; // PRIORITY_FLICKER_REFRESH_RATE_SWITCH votes for disabling refresh rate switching. If the // higher priority voters' result is a range, it will fix the rate to a single choice. // It's used to avoid refresh rate switches in certain conditions which may result in the // user seeing the display flickering when the switches occur. - int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 19; + int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 20; // Force display to [0, 60HZ] if skin temperature is at or above CRITICAL. - int PRIORITY_SKIN_TEMPERATURE = 20; + int PRIORITY_SKIN_TEMPERATURE = 21; // The proximity sensor needs the refresh rate to be locked in order to function, so this is // set to a high priority. - int PRIORITY_PROXIMITY = 21; + int PRIORITY_PROXIMITY = 22; // The Under-Display Fingerprint Sensor (UDFPS) needs the refresh rate to be locked in order // to function, so this needs to be the highest priority of all votes. - int PRIORITY_UDFPS = 22; + int PRIORITY_UDFPS = 23; @IntDef(prefix = { "PRIORITY_" }, value = { PRIORITY_DEFAULT_RENDER_FRAME_RATE, @@ -154,6 +160,7 @@ interface Vote { PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE, PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE, PRIORITY_APP_REQUEST_SIZE, + PRIORITY_REJECTED_MODES, PRIORITY_USER_SETTING_PEAK_REFRESH_RATE, PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE, PRIORITY_SYNCHRONIZED_REFRESH_RATE, @@ -245,6 +252,10 @@ interface Vote { return new SupportedModesVote(modeIds); } + static Vote forRejectedModes(Set<Integer> modeIds) { + return new RejectedModesVote(modeIds); + } + static String priorityToString(int priority) { switch (priority) { case PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE: @@ -253,6 +264,8 @@ interface Vote { return "PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE"; case PRIORITY_APP_REQUEST_SIZE: return "PRIORITY_APP_REQUEST_SIZE"; + case PRIORITY_REJECTED_MODES: + return "PRIORITY_REJECTED_MODES"; case PRIORITY_DEFAULT_RENDER_FRAME_RATE: return "PRIORITY_DEFAULT_REFRESH_RATE"; case PRIORITY_FLICKER_REFRESH_RATE: diff --git a/services/core/java/com/android/server/display/mode/VoteSummary.java b/services/core/java/com/android/server/display/mode/VoteSummary.java index 00a922630d8e..41664930fc2e 100644 --- a/services/core/java/com/android/server/display/mode/VoteSummary.java +++ b/services/core/java/com/android/server/display/mode/VoteSummary.java @@ -55,6 +55,11 @@ final class VoteSummary { @Nullable public List<Integer> supportedModeIds; + /** + * set of rejected modes due to mode config failure for connected display + */ + public Set<Integer> rejectedModeIds = new HashSet<>(); + final boolean mIsDisplayResolutionRangeVotingEnabled; private final boolean mSupportedModesVoteEnabled; @@ -132,6 +137,9 @@ final class VoteSummary { if (!validateModeSupported(mode)) { continue; } + if (!validateModeRejected(mode)) { + continue; + } if (!validateModeSize(mode)) { continue; } @@ -285,6 +293,22 @@ final class VoteSummary { return false; } + private boolean validateModeRejected(Display.Mode mode) { + if (rejectedModeIds == null) { + return true; + } + if (!rejectedModeIds.contains(mode.getModeId())) { + return true; + } + if (mLoggingEnabled) { + Slog.w(TAG, "Discarding mode" + mode.getModeId() + + ", is a rejectedMode" + + ": mode.modeId=" + mode.getModeId() + + ", rejectedModeIds=" + rejectedModeIds); + } + return false; + } + private boolean validateRefreshRatesSupported(Display.Mode mode) { if (supportedRefreshRates == null || !mSupportedModesVoteEnabled) { return true; @@ -397,6 +421,7 @@ final class VoteSummary { requestedRefreshRates.clear(); supportedRefreshRates = null; supportedModeIds = null; + rejectedModeIds.clear(); if (mLoggingEnabled) { Slog.i(TAG, "Summary reset: " + this); } @@ -421,6 +446,7 @@ final class VoteSummary { + ", requestRefreshRates=" + requestedRefreshRates + ", supportedRefreshRates=" + supportedRefreshRates + ", supportedModeIds=" + supportedModeIds + + ", rejectedModeIds=" + rejectedModeIds + ", mIsDisplayResolutionRangeVotingEnabled=" + mIsDisplayResolutionRangeVotingEnabled + ", mSupportedModesVoteEnabled=" + mSupportedModesVoteEnabled diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java index 236333ee433d..18ae0446b3e0 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java @@ -303,6 +303,10 @@ abstract class HdmiCecFeatureAction { return mSource.getDeviceInfo().getPhysicalAddress(); } + protected final int getServicePath() { + return mService.getPhysicalAddress(); + } + protected final void sendUserControlPressedAndReleased(int targetAddress, int uiCommand) { mSource.sendUserControlPressedAndReleased(targetAddress, uiCommand); } diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java index 256905d50dc1..9f6322d9b229 100644 --- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java +++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java @@ -152,7 +152,8 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { // If the device wasn´t the active source yet, // this makes it the active source and wakes it up. mSource.mService.setAndBroadcastActiveSourceFromOneDeviceType( - mTargetAddress, getSourcePath(), "OneTouchPlayAction#broadcastActiveSource()"); + mTargetAddress, getServicePath(), + "OneTouchPlayAction#broadcastActiveSource()"); // When OneTouchPlay is called, client side should be responsible to send out the intent // of which internal source, for example YouTube, it would like to switch to. // Here we only update the active port and the active source records in the local diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index aee5e7f52c5f..559b4ae64e50 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -34,6 +34,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.PermissionManuallyEnforced; import android.annotation.RequiresPermission; +import android.annotation.SuppressLint; import android.annotation.UserIdInt; import android.app.ActivityManagerInternal; import android.bluetooth.BluetoothAdapter; @@ -2625,38 +2626,14 @@ public class InputManagerService extends IInputManager.Stub return mWindowManagerCallbacks.interceptUnhandledKey(event, focus); } + @SuppressLint("MissingPermission") private void initKeyGestures() { InputManager im = Objects.requireNonNull(mContext.getSystemService(InputManager.class)); im.registerKeyGestureEventHandler(new InputManager.KeyGestureEventHandler() { @Override public boolean handleKeyGestureEvent(@NonNull KeyGestureEvent event, @Nullable IBinder focussedToken) { - int deviceId = event.getDeviceId(); - boolean complete = event.getAction() == KeyGestureEvent.ACTION_GESTURE_COMPLETE - && !event.isCancelled(); - switch (event.getKeyGestureType()) { - case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP: - if (complete) { - mKeyboardBacklightController.incrementKeyboardBacklight(deviceId); - } - return true; - case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN: - if (complete) { - mKeyboardBacklightController.decrementKeyboardBacklight(deviceId); - } - return true; - case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE: - // TODO(b/367748270): Add functionality to turn keyboard backlight on/off. - return true; - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK: - if (complete) { - mNative.toggleCapsLock(deviceId); - } - return true; - default: - return false; - - } + return InputManagerService.this.handleKeyGestureEvent(event); } @Override @@ -2666,6 +2643,10 @@ public class InputManagerService extends IInputManager.Stub case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN: case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE: case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK: + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: return true; default: return false; @@ -2675,6 +2656,73 @@ public class InputManagerService extends IInputManager.Stub }); } + @SuppressLint("MissingPermission") + @VisibleForTesting + boolean handleKeyGestureEvent(@NonNull KeyGestureEvent event) { + int deviceId = event.getDeviceId(); + boolean complete = event.getAction() == KeyGestureEvent.ACTION_GESTURE_COMPLETE + && !event.isCancelled(); + switch (event.getKeyGestureType()) { + case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP: + if (complete) { + mKeyboardBacklightController.incrementKeyboardBacklight(deviceId); + } + return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN: + if (complete) { + mKeyboardBacklightController.decrementKeyboardBacklight(deviceId); + } + return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE: + // TODO(b/367748270): Add functionality to turn keyboard backlight on/off. + return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK: + if (complete) { + mNative.toggleCapsLock(deviceId); + } + return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: + if (complete && InputSettings.isAccessibilityBounceKeysFeatureEnabled()) { + final boolean bounceKeysEnabled = + InputSettings.isAccessibilityBounceKeysEnabled(mContext); + InputSettings.setAccessibilityBounceKeysThreshold(mContext, + bounceKeysEnabled ? 0 + : InputSettings.DEFAULT_BOUNCE_KEYS_THRESHOLD_MILLIS); + return true; + } + break; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: + if (complete && InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) { + final boolean mouseKeysEnabled = InputSettings.isAccessibilityMouseKeysEnabled( + mContext); + InputSettings.setAccessibilityMouseKeysEnabled(mContext, !mouseKeysEnabled); + return true; + } + break; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: + if (complete && InputSettings.isAccessibilityStickyKeysFeatureEnabled()) { + final boolean stickyKeysEnabled = + InputSettings.isAccessibilityStickyKeysEnabled(mContext); + InputSettings.setAccessibilityStickyKeysEnabled(mContext, !stickyKeysEnabled); + return true; + } + break; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: + if (complete && InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) { + final boolean slowKeysEnabled = + InputSettings.isAccessibilitySlowKeysEnabled(mContext); + InputSettings.setAccessibilitySlowKeysThreshold(mContext, + slowKeysEnabled ? 0 : InputSettings.DEFAULT_SLOW_KEYS_THRESHOLD_MILLIS); + return true; + } + break; + default: + return false; + + } + return false; + } + // Native callback. @SuppressWarnings("unused") private void onPointerDownOutsideFocus(IBinder touchedToken) { diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index 99c01ce5c15a..5f7ad2797368 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -801,7 +801,15 @@ final class KeyGestureController { + " interceptKeyBeforeQueueing"); return true; case KeyEvent.KEYCODE_DO_NOT_DISTURB: - // TODO(b/365920375): Implement 25Q2 keycode implementation in system + if (enableNew25q2Keycodes()) { + if (firstDown) { + handleKeyGesture(deviceId, new int[]{KeyEvent.KEYCODE_DO_NOT_DISTURB}, + /* modifierState = */0, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, focusedToken, + /* flags = */0, /* appLaunchData = */null); + } + } return true; } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 02dd884ad60d..68001428e567 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -1209,8 +1209,14 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. // Hide soft input before user switch task since switch task may block main handler a while // and delayed the hideCurrentInputLocked(). final var userData = getUserData(userId); - hideCurrentInputLocked(userData.mImeBindingState.mFocusedWindow, 0 /* flags */, - SoftInputShowHideReason.HIDE_SWITCH_USER, userId); + if (Flags.refactorInsetsController()) { + final var statsToken = createStatsTokenForFocusedClient(false /* show */, + SoftInputShowHideReason.HIDE_SWITCH_USER, userId); + setImeVisibilityOnFocusedWindowClient(false, userData, statsToken); + } else { + hideCurrentInputLocked(userData.mImeBindingState.mFocusedWindow, 0 /* flags */, + SoftInputShowHideReason.HIDE_SWITCH_USER, userId); + } final UserSwitchHandlerTask task = new UserSwitchHandlerTask(this, userId, clientToBeReset); mUserSwitchHandlerTask = task; diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java index ef73463122ff..78c10453cd95 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java @@ -18,10 +18,14 @@ package com.android.server.location.contexthub; import android.content.Context; import android.hardware.contexthub.EndpointInfo; +import android.hardware.contexthub.ErrorCode; import android.hardware.contexthub.HubEndpointInfo; import android.hardware.contexthub.HubMessage; import android.hardware.contexthub.IContextHubEndpoint; import android.hardware.contexthub.IContextHubEndpointCallback; +import android.hardware.contexthub.Message; +import android.hardware.contexthub.MessageDeliveryStatus; +import android.hardware.location.ContextHubTransaction; import android.hardware.location.IContextHubTransactionCallback; import android.os.IBinder; import android.os.RemoteException; @@ -78,18 +82,28 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub @GuardedBy("mOpenSessionLock") private final Set<Integer> mActiveRemoteSessionIds = new HashSet<>(); + /** The package name of the app that created the endpoint */ + private final String mPackageName; + + /* Transaction manager used for sending reliable messages */ + private final ContextHubTransactionManager mTransactionManager; + /* package */ ContextHubEndpointBroker( Context context, IContextHubWrapper contextHubProxy, ContextHubEndpointManager endpointManager, EndpointInfo halEndpointInfo, - IContextHubEndpointCallback callback) { + IContextHubEndpointCallback callback, + String packageName, + ContextHubTransactionManager transactionManager) { mContext = context; mContextHubProxy = contextHubProxy; mEndpointManager = endpointManager; mEndpointInfo = new HubEndpointInfo(halEndpointInfo); mHalEndpointInfo = halEndpointInfo; mContextHubEndpointCallback = callback; + mPackageName = packageName; + mTransactionManager = transactionManager; } @Override @@ -175,12 +189,57 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub @Override public void sendMessage( int sessionId, HubMessage message, IContextHubTransactionCallback callback) { - // TODO(b/381102453): Implement this + ContextHubServiceUtil.checkPermissions(mContext); + Message halMessage = ContextHubServiceUtil.createHalMessage(message); + synchronized (mOpenSessionLock) { + if (!mActiveSessionIds.contains(sessionId) + && !mActiveRemoteSessionIds.contains(sessionId)) { + throw new SecurityException( + "sendMessage called on inactive session (id= " + sessionId + ")"); + } + } + + // TODO(b/381102453): Handle permissions + if (callback == null) { + try { + mContextHubProxy.sendMessageToEndpoint(sessionId, halMessage); + } catch (RemoteException e) { + Log.w(TAG, "Exception while sending message on session " + sessionId, e); + } + } else { + ContextHubServiceTransaction transaction = + mTransactionManager.createSessionMessageTransaction( + sessionId, halMessage, mPackageName, callback); + try { + mTransactionManager.addTransaction(transaction); + } catch (IllegalStateException e) { + Log.e( + TAG, + "Unable to add a transaction in sendMessageToEndpoint " + + "(session ID = " + + sessionId + + ")", + e); + transaction.onTransactionComplete( + ContextHubTransaction.RESULT_FAILED_SERVICE_INTERNAL_FAILURE); + } + } } @Override public void sendMessageDeliveryStatus(int sessionId, int messageSeqNumber, byte errorCode) { - // TODO(b/381102453): Implement this + ContextHubServiceUtil.checkPermissions(mContext); + MessageDeliveryStatus status = new MessageDeliveryStatus(); + status.messageSequenceNumber = messageSeqNumber; + status.errorCode = errorCode; + try { + mContextHubProxy.sendMessageDeliveryStatusToEndpoint(sessionId, status); + } catch (RemoteException e) { + Log.w( + TAG, + "Exception while sending message delivery status on session " + sessionId, + e); + } } /** Invoked when the underlying binder of this broker has died at the client process. */ @@ -217,7 +276,8 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub } if (mContextHubEndpointCallback != null) { try { - mContextHubEndpointCallback.onSessionClosed(sessionId, reason); + mContextHubEndpointCallback.onSessionClosed( + sessionId, ContextHubServiceUtil.toAppHubEndpointReason(reason)); } catch (RemoteException e) { Log.e(TAG, "RemoteException while calling onSessionClosed", e); } @@ -238,6 +298,21 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub } } + /* package */ void onMessageReceived(int sessionId, HubMessage message) { + if (mContextHubEndpointCallback != null) { + try { + mContextHubEndpointCallback.onMessageReceived(sessionId, message); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException while calling onMessageReceived", e); + } + } + } + + /* package */ void onMessageDeliveryStatusReceived( + int sessionId, int sequenceNumber, byte errorCode) { + mTransactionManager.onMessageDeliveryResponse(sequenceNumber, errorCode == ErrorCode.OK); + } + /* package */ boolean hasSessionId(int sessionId) { synchronized (mOpenSessionLock) { return mPendingSessionIds.contains(sessionId) diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java index 155a92a21368..07df7f994b24 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java @@ -19,6 +19,7 @@ package com.android.server.location.contexthub; import android.content.Context; import android.hardware.contexthub.EndpointInfo; import android.hardware.contexthub.HubEndpointInfo; +import android.hardware.contexthub.HubMessage; import android.hardware.contexthub.IContextHubEndpoint; import android.hardware.contexthub.IContextHubEndpointCallback; import android.os.RemoteException; @@ -59,6 +60,8 @@ import java.util.concurrent.ConcurrentHashMap; private final HubInfoRegistry mHubInfoRegistry; + private final ContextHubTransactionManager mTransactionManager; + /** A map of endpoint IDs to brokers currently registered. */ private final Map<Long, ContextHubEndpointBroker> mEndpointMap = new ConcurrentHashMap<>(); @@ -93,10 +96,14 @@ import java.util.concurrent.ConcurrentHashMap; private final boolean mSessionIdsValid; /* package */ ContextHubEndpointManager( - Context context, IContextHubWrapper contextHubProxy, HubInfoRegistry hubInfoRegistry) { + Context context, + IContextHubWrapper contextHubProxy, + HubInfoRegistry hubInfoRegistry, + ContextHubTransactionManager transactionManager) { mContext = context; mContextHubProxy = contextHubProxy; mHubInfoRegistry = hubInfoRegistry; + mTransactionManager = transactionManager; int[] range = null; try { range = mContextHubProxy.requestSessionIdRange(SERVICE_SESSION_RANGE); @@ -132,11 +139,14 @@ import java.util.concurrent.ConcurrentHashMap; * * @param pendingEndpointInfo the object describing the endpoint being registered * @param callback the callback interface of the endpoint to register + * @param packageName the name of the package of the calling client * @return the endpoint interface * @throws IllegalStateException if max number of endpoints have already registered */ /* package */ IContextHubEndpoint registerEndpoint( - HubEndpointInfo pendingEndpointInfo, IContextHubEndpointCallback callback) + HubEndpointInfo pendingEndpointInfo, + IContextHubEndpointCallback callback, + String packageName) throws RemoteException { if (!mSessionIdsValid) { throw new IllegalStateException("ContextHubEndpointManager failed to initialize"); @@ -158,7 +168,9 @@ import java.util.concurrent.ConcurrentHashMap; mContextHubProxy, this /* endpointManager */, halEndpointInfo, - callback); + callback, + packageName, + mTransactionManager); mEndpointMap.put(endpointId, broker); try { @@ -283,6 +295,38 @@ import java.util.concurrent.ConcurrentHashMap; } } + @Override + public void onMessageReceived(int sessionId, HubMessage message) { + boolean callbackInvoked = false; + for (ContextHubEndpointBroker broker : mEndpointMap.values()) { + if (broker.hasSessionId(sessionId)) { + broker.onMessageReceived(sessionId, message); + callbackInvoked = true; + break; + } + } + + if (!callbackInvoked) { + Log.w(TAG, "onMessageReceived: unknown session ID " + sessionId); + } + } + + @Override + public void onMessageDeliveryStatusReceived(int sessionId, int sequenceNumber, byte errorCode) { + boolean callbackInvoked = false; + for (ContextHubEndpointBroker broker : mEndpointMap.values()) { + if (broker.hasSessionId(sessionId)) { + broker.onMessageDeliveryStatusReceived(sessionId, sequenceNumber, errorCode); + callbackInvoked = true; + break; + } + } + + if (!callbackInvoked) { + Log.w(TAG, "onMessageDeliveryStatusReceived: unknown session ID " + sessionId); + } + } + /** @return an available endpoint ID */ private long getNewEndpointId() { synchronized (mEndpointLock) { diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java b/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java index 9d52c6a020f4..f1f2217fc3c4 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java @@ -17,6 +17,7 @@ package com.android.server.location.contexthub; import android.hardware.contexthub.EndpointId; import android.hardware.contexthub.HubEndpointInfo; +import android.hardware.contexthub.HubMessage; import android.hardware.contexthub.IEndpointCallback; import android.hardware.contexthub.Message; import android.hardware.contexthub.MessageDeliveryStatus; @@ -51,6 +52,12 @@ public class ContextHubHalEndpointCallback /** Called when a requested endpoint open session is completed */ void onEndpointSessionOpenComplete(int sessionId); + + /** Called when a message is received for the session */ + void onMessageReceived(int sessionId, HubMessage message); + + /** Called when a message delivery status is received for the session */ + void onMessageDeliveryStatusReceived(int sessionId, int sequenceNumber, byte errorCode); } ContextHubHalEndpointCallback( @@ -84,13 +91,6 @@ public class ContextHubHalEndpointCallback } @Override - public void onMessageReceived(int i, Message message) throws RemoteException {} - - @Override - public void onMessageDeliveryStatusReceived(int i, MessageDeliveryStatus messageDeliveryStatus) - throws RemoteException {} - - @Override public void onEndpointSessionOpenRequest( int i, EndpointId destination, EndpointId initiator, String s) throws RemoteException { HubEndpointInfo.HubEndpointIdentifier destinationId = @@ -111,6 +111,19 @@ public class ContextHubHalEndpointCallback } @Override + public void onMessageReceived(int i, Message message) throws RemoteException { + HubMessage hubMessage = ContextHubServiceUtil.createHubMessage(message); + mEndpointSessionCallback.onMessageReceived(i, hubMessage); + } + + @Override + public void onMessageDeliveryStatusReceived(int i, MessageDeliveryStatus messageDeliveryStatus) + throws RemoteException { + mEndpointSessionCallback.onMessageDeliveryStatusReceived( + i, messageDeliveryStatus.messageSequenceNumber, messageDeliveryStatus.errorCode); + } + + @Override public int getInterfaceVersion() throws RemoteException { return IEndpointCallback.VERSION; } diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java index d916eda693d8..165f9d3340e3 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java @@ -334,7 +334,8 @@ public class ContextHubService extends IContextHubService.Stub { try { registry = new HubInfoRegistry(mContextHubWrapper); mEndpointManager = - new ContextHubEndpointManager(mContext, mContextHubWrapper, registry); + new ContextHubEndpointManager( + mContext, mContextHubWrapper, registry, mTransactionManager); Log.i(TAG, "Enabling generic offload API"); } catch (UnsupportedOperationException e) { mEndpointManager = null; @@ -794,14 +795,16 @@ public class ContextHubService extends IContextHubService.Stub { @android.annotation.EnforcePermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) @Override public IContextHubEndpoint registerEndpoint( - HubEndpointInfo pendingHubEndpointInfo, IContextHubEndpointCallback callback) + HubEndpointInfo pendingHubEndpointInfo, + IContextHubEndpointCallback callback, + String packageName) throws RemoteException { super.registerEndpoint_enforcePermission(); if (mEndpointManager == null) { Log.e(TAG, "Endpoint manager failed to initialize"); throw new UnsupportedOperationException("Endpoint registration is not supported"); } - return mEndpointManager.registerEndpoint(pendingHubEndpointInfo, callback); + return mEndpointManager.registerEndpoint(pendingHubEndpointInfo, callback, packageName); } @android.annotation.EnforcePermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubServiceTransaction.java b/services/core/java/com/android/server/location/contexthub/ContextHubServiceTransaction.java index 3aea6d533295..4e96b4442a33 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubServiceTransaction.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubServiceTransaction.java @@ -16,6 +16,7 @@ package com.android.server.location.contexthub; +import android.chre.flags.Flags; import android.hardware.location.ContextHubTransaction; import android.hardware.location.NanoAppState; @@ -46,7 +47,11 @@ abstract class ContextHubServiceTransaction { /** The number of times the transaction has been started (start function called). */ private int mNumCompletedStartCalls; - private final short mHostEndpointId; + /** + * A unique identifier for the entity which owns this transaction, scoped by the transaction + * type. + */ + private final int mOwnerId; private boolean mIsComplete = false; @@ -59,7 +64,7 @@ abstract class ContextHubServiceTransaction { mNextRetryTime = Long.MAX_VALUE; mTimeoutTime = Long.MAX_VALUE; mNumCompletedStartCalls = 0; - mHostEndpointId = Short.MAX_VALUE; + mOwnerId = Integer.MAX_VALUE; } ContextHubServiceTransaction(int id, int type, long nanoAppId, @@ -72,11 +77,11 @@ abstract class ContextHubServiceTransaction { mNextRetryTime = Long.MAX_VALUE; mTimeoutTime = Long.MAX_VALUE; mNumCompletedStartCalls = 0; - mHostEndpointId = Short.MAX_VALUE; + mOwnerId = Integer.MAX_VALUE; } - ContextHubServiceTransaction(int id, int type, String packageName, - int messageSequenceNumber, short hostEndpointId) { + ContextHubServiceTransaction( + int id, int type, String packageName, int messageSequenceNumber, int ownerId) { mTransactionId = id; mTransactionType = type; mNanoAppId = Long.MAX_VALUE; @@ -85,7 +90,7 @@ abstract class ContextHubServiceTransaction { mNextRetryTime = Long.MAX_VALUE; mTimeoutTime = Long.MAX_VALUE; mNumCompletedStartCalls = 0; - mHostEndpointId = hostEndpointId; + mOwnerId = ownerId; } /** @@ -147,8 +152,15 @@ abstract class ContextHubServiceTransaction { return mNumCompletedStartCalls; } - short getHostEndpointId() { - return mHostEndpointId; + /** + * @return A unique identifier for the entity owning this transaction. + */ + long getOwnerId() { + if (Flags.offloadImplementation()) { + return ((long) mTransactionType << 32) | (0x00000000FFFFFFFFL & mOwnerId); + } else { + return mOwnerId; + } } /** @@ -215,15 +227,16 @@ abstract class ContextHubServiceTransaction { out.append(", messageSequenceNumber = "); out.append(mMessageSequenceNumber); } - if (mTransactionType == ContextHubTransaction.TYPE_RELIABLE_MESSAGE) { + if (mTransactionType == ContextHubTransaction.TYPE_RELIABLE_MESSAGE + || mTransactionType == ContextHubTransaction.TYPE_HUB_MESSAGE_REQUIRES_RESPONSE) { out.append(", nextRetryTime = "); out.append(mNextRetryTime); out.append(", timeoutTime = "); out.append(mTimeoutTime); out.append(", numCompletedStartCalls = "); out.append(mNumCompletedStartCalls); - out.append(", hostEndpointId = "); - out.append(mHostEndpointId); + out.append(", ownerId = "); + out.append(getOwnerId()); } out.append(")"); diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java b/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java index 05be427f9daf..77ec51af80a7 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java @@ -19,8 +19,12 @@ package com.android.server.location.contexthub; import android.Manifest; import android.content.Context; import android.hardware.contexthub.EndpointInfo; +import android.hardware.contexthub.HubEndpoint; import android.hardware.contexthub.HubEndpointInfo; +import android.hardware.contexthub.HubMessage; import android.hardware.contexthub.HubServiceInfo; +import android.hardware.contexthub.Message; +import android.hardware.contexthub.Reason; import android.hardware.contexthub.V1_0.AsyncEventType; import android.hardware.contexthub.V1_0.ContextHubMsg; import android.hardware.contexthub.V1_0.HostEndPoint; @@ -465,4 +469,70 @@ import java.util.List; } return outputInfo; } + + /** + * Converts a HubMessage object to a AIDL HAL Message object. + * + * @param message the HubMessage message to convert + * @return the AIDL HAL message + */ + /* package */ + static Message createHalMessage(HubMessage message) { + Message outMessage = new Message(); + outMessage.flags = + message.getDeliveryParams().isResponseRequired() + ? Message.FLAG_REQUIRES_DELIVERY_STATUS + : 0; + outMessage.permissions = new String[0]; + outMessage.sequenceNumber = message.getMessageSequenceNumber(); + outMessage.type = message.getMessageType(); + outMessage.content = message.getMessageBody(); + return outMessage; + } + + /** + * Converts a AIDL HAL Message object to a HubMessage object. + * + * @param message the AIDL HAL Message message to convert + * @return the HubMessage + */ + /* package */ + static HubMessage createHubMessage(Message message) { + boolean isReliable = (message.flags & Message.FLAG_REQUIRES_DELIVERY_STATUS) != 0; + return HubMessage.createMessage( + message.type, + message.content, + HubMessage.DeliveryParams.makeBasic().setResponseRequired(isReliable)); + } + + /** + * Converts a byte integer defined by Reason.aidl to HubEndpoint.Reason values exposed to apps. + * + * @param reason The Reason.aidl value + * @return The converted HubEndpoint.Reason value + */ + /* package */ + static @HubEndpoint.Reason int toAppHubEndpointReason(byte reason) { + switch (reason) { + case Reason.UNSPECIFIED: + case Reason.OUT_OF_MEMORY: + case Reason.TIMEOUT: + return HubEndpoint.REASON_FAILURE; + case Reason.OPEN_ENDPOINT_SESSION_REQUEST_REJECTED: + return HubEndpoint.REASON_OPEN_ENDPOINT_SESSION_REQUEST_REJECTED; + case Reason.CLOSE_ENDPOINT_SESSION_REQUESTED: + return HubEndpoint.REASON_CLOSE_ENDPOINT_SESSION_REQUESTED; + case Reason.ENDPOINT_INVALID: + return HubEndpoint.REASON_ENDPOINT_INVALID; + case Reason.ENDPOINT_GONE: + case Reason.ENDPOINT_CRASHED: + case Reason.HUB_RESET: + return HubEndpoint.REASON_ENDPOINT_STOPPED; + case Reason.PERMISSION_DENIED: + return HubEndpoint.REASON_PERMISSION_DENIED; + default: + Log.w(TAG, "toAppHubEndpointReason: invalid reason: " + reason); + return HubEndpoint.REASON_FAILURE; + } + } } diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java index ccfa61b400b6..5dd40ea97a64 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java @@ -17,6 +17,7 @@ package com.android.server.location.contexthub; import android.chre.flags.Flags; +import android.hardware.contexthub.Message; import android.hardware.location.ContextHubTransaction; import android.hardware.location.IContextHubTransactionCallback; import android.hardware.location.NanoAppBinary; @@ -84,9 +85,9 @@ import java.util.concurrent.atomic.AtomicInteger; protected final Map<Integer, ContextHubServiceTransaction> mReliableMessageTransactionMap = new HashMap<>(); - /** A set of host endpoint IDs that have an active pending transaction. */ + /** A set of IDs of transaction owners that have an active pending transaction. */ @GuardedBy("mReliableMessageLock") - protected final Set<Short> mReliableMessageHostEndpointIdActiveSet = new HashSet<>(); + protected final Set<Long> mReliableMessageOwnerIdActiveSet = new HashSet<>(); protected final AtomicInteger mNextAvailableId = new AtomicInteger(); @@ -355,27 +356,32 @@ import java.util.concurrent.atomic.AtomicInteger; /** * Creates a transaction to send a reliable message. * - * @param hostEndpointId The ID of the host endpoint sending the message. - * @param contextHubId The ID of the hub to send the message to. - * @param message The message to send. + * @param ownerId The ID of the transaction owner. + * @param contextHubId The ID of the hub to send the message to. + * @param message The message to send. * @param transactionCallback The callback of the transactions. - * @param packageName The host package associated with this transaction. + * @param packageName The host package associated with this transaction. * @return The generated transaction. */ /* package */ ContextHubServiceTransaction createMessageTransaction( - short hostEndpointId, int contextHubId, NanoAppMessage message, - IContextHubTransactionCallback transactionCallback, String packageName) { - return new ContextHubServiceTransaction(mNextAvailableId.getAndIncrement(), - ContextHubTransaction.TYPE_RELIABLE_MESSAGE, packageName, - mNextAvailableMessageSequenceNumber.getAndIncrement(), hostEndpointId) { + short ownerId, + int contextHubId, + NanoAppMessage message, + IContextHubTransactionCallback transactionCallback, + String packageName) { + return new ContextHubServiceTransaction( + mNextAvailableId.getAndIncrement(), + ContextHubTransaction.TYPE_RELIABLE_MESSAGE, + packageName, + mNextAvailableMessageSequenceNumber.getAndIncrement(), + ownerId) { @Override /* package */ int onTransact() { try { message.setIsReliable(/* isReliable= */ true); message.setMessageSequenceNumber(getMessageSequenceNumber()); - return mContextHubProxy.sendMessageToContextHub(hostEndpointId, contextHubId, - message); + return mContextHubProxy.sendMessageToContextHub(ownerId, contextHubId, message); } catch (RemoteException e) { Log.e(TAG, "RemoteException while trying to send a reliable message", e); return ContextHubTransaction.RESULT_FAILED_UNKNOWN; @@ -394,6 +400,48 @@ import java.util.concurrent.atomic.AtomicInteger; } /** + * Creates a transaction to send a message through a session. + * + * @param sessionId The ID of the endpoint session the message should be sent through. + * @param message The message to send. + * @param transactionCallback The callback of the transactions. + * @return The generated transaction. + */ + /* package */ ContextHubServiceTransaction createSessionMessageTransaction( + int sessionId, + Message message, + String packageName, + IContextHubTransactionCallback transactionCallback) { + return new ContextHubServiceTransaction( + mNextAvailableId.getAndIncrement(), + ContextHubTransaction.TYPE_HUB_MESSAGE_REQUIRES_RESPONSE, + packageName, + mNextAvailableMessageSequenceNumber.getAndIncrement(), + sessionId) { + @Override + /* package */ int onTransact() { + try { + message.sequenceNumber = getMessageSequenceNumber(); + mContextHubProxy.sendMessageToEndpoint(sessionId, message); + return ContextHubTransaction.RESULT_SUCCESS; + } catch (RemoteException e) { + Log.e(TAG, "RemoteException while trying to send a session message", e); + return ContextHubTransaction.RESULT_FAILED_UNKNOWN; + } + } + + @Override + /* package */ void onTransactionComplete(@ContextHubTransaction.Result int result) { + try { + transactionCallback.onTransactionComplete(result); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException while calling client onTransactionComplete", e); + } + } + }; + } + + /** * Creates a transaction for querying for a list of nanoapps. * * @param contextHubId the ID of the hub to query @@ -452,9 +500,14 @@ import java.util.concurrent.atomic.AtomicInteger; mTransactionRecordDeque.add(new TransactionRecord(transaction.toString())); } - if (Flags.reliableMessageRetrySupportService() - && transaction.getTransactionType() - == ContextHubTransaction.TYPE_RELIABLE_MESSAGE) { + boolean isReliableMessage = + Flags.reliableMessageRetrySupportService() + && (transaction.getTransactionType() + == ContextHubTransaction.TYPE_RELIABLE_MESSAGE); + boolean isEndpointMessage = + (transaction.getTransactionType() + == ContextHubTransaction.TYPE_HUB_MESSAGE_REQUIRES_RESPONSE); + if (isReliableMessage || isEndpointMessage) { synchronized (mReliableMessageLock) { if (mReliableMessageTransactionMap.size() >= MAX_PENDING_REQUESTS) { throw new IllegalStateException( @@ -766,10 +819,10 @@ import java.util.concurrent.atomic.AtomicInteger; mReliableMessageTransactionMap.entrySet().iterator(); while (iter.hasNext()) { ContextHubServiceTransaction transaction = iter.next().getValue(); - short hostEndpointId = transaction.getHostEndpointId(); + long ownerId = transaction.getOwnerId(); int numCompletedStartCalls = transaction.getNumCompletedStartCalls(); if (numCompletedStartCalls == 0 - && mReliableMessageHostEndpointIdActiveSet.contains(hostEndpointId)) { + && mReliableMessageOwnerIdActiveSet.contains(ownerId)) { continue; } @@ -871,7 +924,7 @@ import java.util.concurrent.atomic.AtomicInteger; } else { iter.remove(); } - mReliableMessageHostEndpointIdActiveSet.remove(transaction.getHostEndpointId()); + mReliableMessageOwnerIdActiveSet.remove(transaction.getOwnerId()); } /** @@ -906,7 +959,7 @@ import java.util.concurrent.atomic.AtomicInteger; transaction.setTimeoutTime(now + RELIABLE_MESSAGE_TIMEOUT.toNanos()); } transaction.setNumCompletedStartCalls(numCompletedStartCalls + 1); - mReliableMessageHostEndpointIdActiveSet.add(transaction.getHostEndpointId()); + mReliableMessageOwnerIdActiveSet.add(transaction.getOwnerId()); } private int toStatsTransactionResult(@ContextHubTransaction.Result int result) { diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManagerOld.java b/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManagerOld.java index a67fa308a6ea..657375d2cbd7 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManagerOld.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManagerOld.java @@ -18,28 +18,14 @@ package com.android.server.location.contexthub; import android.chre.flags.Flags; import android.hardware.location.ContextHubTransaction; -import android.hardware.location.IContextHubTransactionCallback; -import android.hardware.location.NanoAppBinary; -import android.hardware.location.NanoAppMessage; import android.hardware.location.NanoAppState; -import android.os.RemoteException; import android.os.SystemClock; import android.util.Log; -import java.time.Duration; -import java.util.ArrayDeque; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; /** * Manages transactions at the Context Hub Service. @@ -326,10 +312,10 @@ import java.util.concurrent.atomic.AtomicInteger; mReliableMessageTransactionMap.entrySet().iterator(); while (iter.hasNext()) { ContextHubServiceTransaction transaction = iter.next().getValue(); - short hostEndpointId = transaction.getHostEndpointId(); + long ownerId = transaction.getOwnerId(); int numCompletedStartCalls = transaction.getNumCompletedStartCalls(); if (numCompletedStartCalls == 0 - && mReliableMessageHostEndpointIdActiveSet.contains(hostEndpointId)) { + && mReliableMessageOwnerIdActiveSet.contains(ownerId)) { continue; } @@ -394,7 +380,7 @@ import java.util.concurrent.atomic.AtomicInteger; } else { iter.remove(); } - mReliableMessageHostEndpointIdActiveSet.remove(transaction.getHostEndpointId()); + mReliableMessageOwnerIdActiveSet.remove(transaction.getOwnerId()); Log.d( TAG, @@ -436,7 +422,7 @@ import java.util.concurrent.atomic.AtomicInteger; transaction.setTimeoutTime(now + RELIABLE_MESSAGE_TIMEOUT.toNanos()); } transaction.setNumCompletedStartCalls(numCompletedStartCalls + 1); - mReliableMessageHostEndpointIdActiveSet.add(transaction.getHostEndpointId()); + mReliableMessageOwnerIdActiveSet.add(transaction.getOwnerId()); } @Override diff --git a/services/core/java/com/android/server/location/contexthub/HubInfoRegistry.java b/services/core/java/com/android/server/location/contexthub/HubInfoRegistry.java index 6f5f191849e2..503f1aca64d9 100644 --- a/services/core/java/com/android/server/location/contexthub/HubInfoRegistry.java +++ b/services/core/java/com/android/server/location/contexthub/HubInfoRegistry.java @@ -198,7 +198,8 @@ class HubInfoRegistry implements ContextHubHalEndpointCallback.IEndpointLifecycl removedInfoList.toArray(new HubEndpointInfo[removedInfoList.size()]), (cb, infoList) -> { try { - cb.onEndpointsStopped(infoList, reason); + cb.onEndpointsStopped( + infoList, ContextHubServiceUtil.toAppHubEndpointReason(reason)); } catch (RemoteException e) { if (e instanceof DeadObjectException) { Log.w(TAG, "onEndpointStopped: callback died, unregistering"); diff --git a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java index 6cb942980403..e1df503eccdb 100644 --- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java +++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java @@ -21,6 +21,7 @@ import android.chre.flags.Flags; import android.hardware.contexthub.EndpointId; import android.hardware.contexthub.HostEndpointInfo; import android.hardware.contexthub.HubEndpointInfo; +import android.hardware.contexthub.Message; import android.hardware.contexthub.MessageDeliveryStatus; import android.hardware.contexthub.NanSessionRequest; import android.hardware.contexthub.V1_0.ContextHub; @@ -264,6 +265,13 @@ public abstract class IContextHubWrapper { /** Notifies the completion of a session opened by the HAL */ public void endpointSessionOpenComplete(int sessionId) throws RemoteException {} + /** Sends a message to a remote endpoint */ + public void sendMessageToEndpoint(int sessionId, Message msg) throws RemoteException {} + + /** Sends a message delivery status to a remote endpoint */ + public void sendMessageDeliveryStatusToEndpoint(int sessionId, MessageDeliveryStatus msgStatus) + throws RemoteException {} + /** * @return True if this version of the Contexthub HAL supports Location setting notifications. */ @@ -757,6 +765,25 @@ public abstract class IContextHubWrapper { hub.endpointSessionOpenComplete(sessionId); } + @Override + public void sendMessageToEndpoint(int sessionId, Message msg) throws RemoteException { + android.hardware.contexthub.IContextHub hub = getHub(); + if (hub == null) { + return; + } + hub.sendMessageToEndpoint(sessionId, msg); + } + + @Override + public void sendMessageDeliveryStatusToEndpoint( + int sessionId, MessageDeliveryStatus msgStatus) throws RemoteException { + android.hardware.contexthub.IContextHub hub = getHub(); + if (hub == null) { + return; + } + hub.sendMessageDeliveryStatusToEndpoint(sessionId, msgStatus); + } + public boolean supportsLocationSettingNotifications() { return true; } diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java index db1e6b465ff8..d8c35358102d 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java @@ -66,6 +66,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { private final int mUserId; private final Handler mHandler; private final boolean mIsSelfScanOnlyProvider; + private final boolean mSupportsSystemMediaRouting; private final ServiceConnection mServiceConnection = new ServiceConnectionImpl(); // Connection state @@ -95,12 +96,14 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { @NonNull Looper looper, @NonNull ComponentName componentName, boolean isSelfScanOnlyProvider, + boolean supportsSystemMediaRouting, int userId) { super(componentName, /* isSystemRouteProvider= */ false); mContext = Objects.requireNonNull(context, "Context must not be null."); mRequestIdToSessionCreationRequest = new LongSparseArray<>(); mSessionOriginalIdToTransferRequest = new HashMap<>(); mIsSelfScanOnlyProvider = isSelfScanOnlyProvider; + mSupportsSystemMediaRouting = supportsSystemMediaRouting; mUserId = userId; mHandler = new Handler(looper); } @@ -276,13 +279,20 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { if (!mRunning) { return false; } + // We bind if any manager is scanning (regardless of whether an app is scanning) to give + // the opportunity for providers to publish routing sessions that were established + // directly between the app and the provider (typically via AndroidX MediaRouter). See + // b/176774510#comment20 for more information. boolean bindDueToManagerScan = mIsManagerScanning && !Flags.enablePreventionOfManagerScansWhenNoAppsScan(); - if (!getSessionInfos().isEmpty() || bindDueToManagerScan) { - // We bind if any manager is scanning (regardless of whether an app is scanning) to give - // the opportunity for providers to publish routing sessions that were established - // directly between the app and the provider (typically via AndroidX MediaRouter). See - // b/176774510#comment20 for more information. + // We also bind if this provider supports system media routing, because even if an app + // doesn't have any registered discovery preference, we should still be able to route their + // system media. + boolean bindDueToSystemMediaRoutingSupport = + mIsManagerScanning && mSupportsSystemMediaRouting; + if (!getSessionInfos().isEmpty() + || bindDueToManagerScan + || bindDueToSystemMediaRoutingSupport) { return true; } boolean anAppIsScanning = @@ -651,11 +661,12 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { } return TextUtils.formatSimple( "ProviderServiceProxy - package: %s, bound: %b, connection (active:%b, ready:%b), " - + "pending (session creations: %d, transfers: %d)", + + "system media=%b, pending (session creations: %d, transfers: %d)", mComponentName.getPackageName(), mBound, mActiveConnection != null, mConnectionReady, + mSupportsSystemMediaRouting, pendingSessionCreationCount, pendingTransferCount); } @@ -697,7 +708,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { Connection(IMediaRoute2ProviderService serviceBinder) { mService = serviceBinder; - mCallbackStub = new ServiceCallbackStub(this); + mCallbackStub = new ServiceCallbackStub(this, mSupportsSystemMediaRouting); } public boolean register() { @@ -811,9 +822,11 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { private static final class ServiceCallbackStub extends IMediaRoute2ProviderServiceCallback.Stub { private final WeakReference<Connection> mConnectionRef; + private final boolean mAllowSystemMediaRoutes; - ServiceCallbackStub(Connection connection) { + ServiceCallbackStub(Connection connection, boolean allowSystemMediaRoutes) { mConnectionRef = new WeakReference<>(connection); + mAllowSystemMediaRoutes = allowSystemMediaRoutes; } public void dispose() { @@ -846,6 +859,13 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { + "Disallowed route: " + route); } + + if (route.supportsSystemMediaRouting() && !mAllowSystemMediaRoutes) { + throw new SecurityException( + "This provider is not allowed to publish routes that support system" + + " media routing. Disallowed route: " + + route); + } } Connection connection = mConnectionRef.get(); diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java index 93ef6f044e1b..69c460e0f19d 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java @@ -17,7 +17,9 @@ package com.android.server.media; import static android.content.pm.PackageManager.GET_RESOLVED_FILTER; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import android.Manifest; import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -130,22 +132,33 @@ final class MediaRoute2ProviderWatcher { ServiceInfo serviceInfo = resolveInfo.serviceInfo; if (serviceInfo != null) { boolean isSelfScanOnlyProvider = false; + boolean supportsSystemMediaRouting = false; Iterator<String> categoriesIterator = resolveInfo.filter.categoriesIterator(); if (categoriesIterator != null) { while (categoriesIterator.hasNext()) { + String category = categoriesIterator.next(); isSelfScanOnlyProvider |= - MediaRoute2ProviderService.CATEGORY_SELF_SCAN_ONLY.equals( - categoriesIterator.next()); + MediaRoute2ProviderService.CATEGORY_SELF_SCAN_ONLY.equals(category); + supportsSystemMediaRouting |= + MediaRoute2ProviderService.SERVICE_INTERFACE_SYSTEM_MEDIA.equals( + category); } } int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name); if (sourceIndex < 0) { + supportsSystemMediaRouting &= Flags.enableMirroringInMediaRouter2(); + supportsSystemMediaRouting &= + mPackageManager.checkPermission( + Manifest.permission.MODIFY_AUDIO_ROUTING, + serviceInfo.packageName) + == PERMISSION_GRANTED; MediaRoute2ProviderServiceProxy proxy = new MediaRoute2ProviderServiceProxy( mContext, mHandler.getLooper(), new ComponentName(serviceInfo.packageName, serviceInfo.name), isSelfScanOnlyProvider, + supportsSystemMediaRouting, mUserId); Slog.i( TAG, diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index abc067d4aa9c..e18ed410c045 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -2581,9 +2581,9 @@ class MediaRouter2ServiceImpl { mUserRecord = userRecord; mSystemProvider = Flags.enableMirroringInMediaRouter2() - ? new SystemMediaRoute2Provider2( + ? SystemMediaRoute2Provider2.create( service.mContext, UserHandle.of(userRecord.mUserId), looper) - : new SystemMediaRoute2Provider( + : SystemMediaRoute2Provider.create( service.mContext, UserHandle.of(userRecord.mUserId), looper); mRouteProviders.add(getSystemProvider()); mWatcher = new MediaRoute2ProviderWatcher(service.mContext, this, diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index 5fb80ba92091..8dfba39dcfd8 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -89,8 +89,12 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { @Nullable private volatile SessionCreationOrTransferRequest mPendingTransferRequest; - SystemMediaRoute2Provider(Context context, UserHandle user, Looper looper) { - this(context, COMPONENT_NAME, user, looper); + public static SystemMediaRoute2Provider create( + Context context, UserHandle user, Looper looper) { + var instance = new SystemMediaRoute2Provider(context, COMPONENT_NAME, user, looper); + instance.updateProviderState(); + instance.updateSessionInfosIfNeeded(); + return instance; } protected SystemMediaRoute2Provider( @@ -124,8 +128,6 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { notifySessionInfoUpdated(); } })); - updateProviderState(); - updateSessionInfosIfNeeded(); } public void start() { @@ -362,7 +364,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } } - private void updateProviderState() { + protected void updateProviderState() { MediaRoute2ProviderInfo.Builder builder = new MediaRoute2ProviderInfo.Builder(); // We must have a device route in the provider info. diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java index 8a14a3866860..85b30ad8cadb 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java @@ -35,7 +35,15 @@ import android.os.UserHandle; SystemMediaRoute2Provider2.class.getPackage().getName(), SystemMediaRoute2Provider2.class.getName()); - SystemMediaRoute2Provider2(Context context, UserHandle user, Looper looper) { + public static SystemMediaRoute2Provider2 create( + Context context, UserHandle user, Looper looper) { + var instance = new SystemMediaRoute2Provider2(context, user, looper); + instance.updateProviderState(); + instance.updateSessionInfosIfNeeded(); + return instance; + } + + private SystemMediaRoute2Provider2(Context context, UserHandle user, Looper looper) { super(context, COMPONENT_NAME, user, looper); } } diff --git a/services/core/java/com/android/server/media/quality/BiMap.java b/services/core/java/com/android/server/media/quality/BiMap.java new file mode 100644 index 000000000000..82b82847a29f --- /dev/null +++ b/services/core/java/com/android/server/media/quality/BiMap.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.media.quality; + +import android.util.ArrayMap; + +import java.util.Collection; +import java.util.Map; + +/** + * A very basic bidirectional map. + * + * @param <K> data type of Key + * @param <V> data type of Value + */ +public class BiMap<K, V> { + private Map<K, V> mPrimaryMap = new ArrayMap<>(); + private Map<V, K> mSecondaryMap = new ArrayMap<>(); + + /** + * Add key and associated value to the map + * + * @param key key to add + * @param value value to add + * @return true if successfully added, false otherwise + */ + public boolean put(K key, V value) { + if (key == null || value == null || mPrimaryMap.containsKey(key) + || mSecondaryMap.containsKey(value)) { + return false; + } + + mPrimaryMap.put(key, value); + mSecondaryMap.put(value, key); + return true; + } + + /** + * Remove key and associated value from the map + * + * @param key key to remove + * @return true if removed, false otherwise + */ + public boolean remove(K key) { + if (key == null) { + return false; + } + if (mPrimaryMap.containsKey(key)) { + V value = getValue(key); + mPrimaryMap.remove(key); + mSecondaryMap.remove(value); + return true; + } + return false; + } + + /** + * Remove value and associated key from the map + * + * @param value value to remove + * @return true if removed, false otherwise + */ + public boolean removeValue(V value) { + if (value == null) { + return false; + } + return remove(getKey(value)); + } + + /** + * Get the value + * + * @param key key for which to get value + * @return V + */ + public V getValue(K key) { + return mPrimaryMap.get(key); + } + + /** + * Get the key + * + * @param value value for which to get key + * @return K + */ + public K getKey(V value) { + return mSecondaryMap.get(value); + } + + /** + * Get the values of the map. + * @return Collection + */ + public Collection<V> getValues() { + return mPrimaryMap.values(); + } + + /** + * Clear the map + */ + public void clear() { + mPrimaryMap.clear(); + mSecondaryMap.clear(); + } +} diff --git a/services/core/java/com/android/server/media/quality/MediaQualityService.java b/services/core/java/com/android/server/media/quality/MediaQualityService.java index 1673b8e6a0af..3e488bf2207f 100644 --- a/services/core/java/com/android/server/media/quality/MediaQualityService.java +++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java @@ -31,15 +31,13 @@ import android.media.quality.PictureProfile; import android.media.quality.PictureProfileHandle; import android.media.quality.SoundProfile; import android.media.quality.SoundProfileHandle; +import android.os.Binder; import android.os.PersistableBundle; import android.os.UserHandle; import android.util.Log; import com.android.server.SystemService; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - import org.json.JSONException; import org.json.JSONObject; @@ -58,6 +56,7 @@ public class MediaQualityService extends SystemService { private static final boolean DEBUG = false; private static final String TAG = "MediaQualityService"; + private static final int MAX_UUID_GENERATION_ATTEMPTS = 10; private final Context mContext; private final MediaQualityDbHelper mMediaQualityDbHelper; private final BiMap<Long, String> mPictureProfileTempIdMap; @@ -66,8 +65,8 @@ public class MediaQualityService extends SystemService { public MediaQualityService(Context context) { super(context); mContext = context; - mPictureProfileTempIdMap = HashBiMap.create(); - mSoundProfileTempIdMap = HashBiMap.create(); + mPictureProfileTempIdMap = new BiMap<>(); + mSoundProfileTempIdMap = new BiMap<>(); mMediaQualityDbHelper = new MediaQualityDbHelper(mContext); mMediaQualityDbHelper.setWriteAheadLoggingEnabled(true); mMediaQualityDbHelper.setIdleConnectionTimeout(30); @@ -85,29 +84,40 @@ public class MediaQualityService extends SystemService { public PictureProfile createPictureProfile(PictureProfile pp, UserHandle user) { SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase(); - ContentValues values = new ContentValues(); - values.put(BaseParameters.PARAMETER_TYPE, pp.getProfileType()); - values.put(BaseParameters.PARAMETER_NAME, pp.getName()); - values.put(BaseParameters.PARAMETER_PACKAGE, pp.getPackageName()); - values.put(BaseParameters.PARAMETER_INPUT_ID, pp.getInputId()); - values.put(mMediaQualityDbHelper.SETTINGS, persistableBundleToJson(pp.getParameters())); + ContentValues values = getContentValues(null, + pp.getProfileType(), + pp.getName(), + pp.getPackageName(), + pp.getInputId(), + pp.getParameters()); // id is auto-generated by SQLite upon successful insertion of row Long id = db.insert(mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, null, values); populateTempIdMap(mPictureProfileTempIdMap, id); - pp.setProfileId(mPictureProfileTempIdMap.get(id)); + pp.setProfileId(mPictureProfileTempIdMap.getValue(id)); return pp; } @Override public void updatePictureProfile(String id, PictureProfile pp, UserHandle user) { - // TODO: implement + Long intId = mPictureProfileTempIdMap.getKey(id); + + ContentValues values = getContentValues(intId, + pp.getProfileType(), + pp.getName(), + pp.getPackageName(), + pp.getInputId(), + pp.getParameters()); + + SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase(); + db.replace(mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, + null, values); } @Override public void removePictureProfile(String id, UserHandle user) { - Long intId = mPictureProfileTempIdMap.inverse().get(id); + Long intId = mPictureProfileTempIdMap.getKey(id); if (intId != null) { SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase(); String selection = BaseParameters.PARAMETER_ID + " = ?"; @@ -157,6 +167,11 @@ public class MediaQualityService extends SystemService { @Override public List<PictureProfile> getAvailablePictureProfiles( boolean includeParams, UserHandle user) { + String[] packageNames = mContext.getPackageManager().getPackagesForUid( + Binder.getCallingUid()); + if (packageNames != null && packageNames.length == 1 && !packageNames[0].isEmpty()) { + return getPictureProfilesByPackage(packageNames[0], includeParams, user); + } return new ArrayList<>(); } @@ -191,29 +206,39 @@ public class MediaQualityService extends SystemService { public SoundProfile createSoundProfile(SoundProfile sp, UserHandle user) { SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase(); - ContentValues values = new ContentValues(); - values.put(BaseParameters.PARAMETER_TYPE, sp.getProfileType()); - values.put(BaseParameters.PARAMETER_NAME, sp.getName()); - values.put(BaseParameters.PARAMETER_PACKAGE, sp.getPackageName()); - values.put(BaseParameters.PARAMETER_INPUT_ID, sp.getInputId()); - values.put(mMediaQualityDbHelper.SETTINGS, persistableBundleToJson(sp.getParameters())); + ContentValues values = getContentValues(null, + sp.getProfileType(), + sp.getName(), + sp.getPackageName(), + sp.getInputId(), + sp.getParameters()); // id is auto-generated by SQLite upon successful insertion of row Long id = db.insert(mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME, null, values); populateTempIdMap(mSoundProfileTempIdMap, id); - sp.setProfileId(mSoundProfileTempIdMap.get(id)); + sp.setProfileId(mSoundProfileTempIdMap.getValue(id)); return sp; } @Override - public void updateSoundProfile(String id, SoundProfile pp, UserHandle user) { - // TODO: implement + public void updateSoundProfile(String id, SoundProfile sp, UserHandle user) { + Long intId = mSoundProfileTempIdMap.getKey(id); + + ContentValues values = getContentValues(intId, + sp.getProfileType(), + sp.getName(), + sp.getPackageName(), + sp.getInputId(), + sp.getParameters()); + + SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase(); + db.replace(mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME, null, values); } @Override public void removeSoundProfile(String id, UserHandle user) { - Long intId = mSoundProfileTempIdMap.inverse().get(id); + Long intId = mSoundProfileTempIdMap.getKey(id); if (intId != null) { SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase(); String selection = BaseParameters.PARAMETER_ID + " = ?"; @@ -263,6 +288,11 @@ public class MediaQualityService extends SystemService { @Override public List<SoundProfile> getAvailableSoundProfiles( boolean includeParams, UserHandle user) { + String[] packageNames = mContext.getPackageManager().getPackagesForUid( + Binder.getCallingUid()); + if (packageNames != null && packageNames.length == 1 && !packageNames[0].isEmpty()) { + return getSoundProfilesByPackage(packageNames[0], includeParams, user); + } return new ArrayList<>(); } @@ -284,12 +314,17 @@ public class MediaQualityService extends SystemService { } private void populateTempIdMap(BiMap<Long, String> map, Long id) { - if (id != null && map.get(id) == null) { - String uuid = UUID.randomUUID().toString(); - while (map.inverse().containsKey(uuid)) { + if (id != null && map.getValue(id) == null) { + String uuid; + int attempts = 0; + while (attempts < MAX_UUID_GENERATION_ATTEMPTS) { uuid = UUID.randomUUID().toString(); + if (map.getKey(uuid) == null) { + map.put(id, uuid); + return; + } + attempts++; } - map.put(id, uuid); } } @@ -316,7 +351,7 @@ public class MediaQualityService extends SystemService { return json.toString(); } - private PersistableBundle jsonToBundle(String jsonString) { + private PersistableBundle jsonToPersistableBundle(String jsonString) { PersistableBundle bundle = new PersistableBundle(); if (jsonString != null) { JSONObject jsonObject = null; @@ -347,6 +382,30 @@ public class MediaQualityService extends SystemService { return bundle; } + private ContentValues getContentValues(Long dbId, Integer profileType, String name, + String packageName, String inputId, PersistableBundle params) { + ContentValues values = new ContentValues(); + if (dbId != null) { + values.put(BaseParameters.PARAMETER_ID, dbId); + } + if (profileType != null) { + values.put(BaseParameters.PARAMETER_TYPE, profileType); + } + if (name != null) { + values.put(BaseParameters.PARAMETER_NAME, name); + } + if (packageName != null) { + values.put(BaseParameters.PARAMETER_PACKAGE, packageName); + } + if (inputId != null) { + values.put(BaseParameters.PARAMETER_INPUT_ID, inputId); + } + if (params != null) { + values.put(mMediaQualityDbHelper.SETTINGS, persistableBundleToJson(params)); + } + return values; + } + private String[] getAllMediaProfileColumns() { return new String[]{ BaseParameters.PARAMETER_ID, @@ -365,7 +424,7 @@ public class MediaQualityService extends SystemService { getName(cursor), getInputId(cursor), getPackageName(cursor), - jsonToBundle(getSettingsString(cursor)), + jsonToPersistableBundle(getSettingsString(cursor)), PictureProfileHandle.NONE ); } @@ -377,7 +436,7 @@ public class MediaQualityService extends SystemService { getName(cursor), getInputId(cursor), getPackageName(cursor), - jsonToBundle(getSettingsString(cursor)), + jsonToPersistableBundle(getSettingsString(cursor)), SoundProfileHandle.NONE ); } @@ -386,7 +445,7 @@ public class MediaQualityService extends SystemService { int colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_ID); Long dbId = colIndex != -1 ? cursor.getLong(colIndex) : null; populateTempIdMap(map, dbId); - return map.get(dbId); + return map.getValue(dbId); } private int getType(Cursor cursor) { diff --git a/services/core/java/com/android/server/media/quality/OWNERS b/services/core/java/com/android/server/media/quality/OWNERS index e455846dd75d..7171aa4ce9b6 100644 --- a/services/core/java/com/android/server/media/quality/OWNERS +++ b/services/core/java/com/android/server/media/quality/OWNERS @@ -1,2 +1,3 @@ shubang@google.com -haofanw@google.com
\ No newline at end of file +haofanw@google.com +pkandhalu@google.com
\ No newline at end of file diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 39eea740a902..504c29891b9c 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -361,6 +361,7 @@ import com.android.server.lights.LightsManager; import com.android.server.notification.GroupHelper.NotificationAttributes; import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.ManagedServices.UserProfiles; +import com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent; import com.android.server.notification.toast.CustomToastRecord; import com.android.server.notification.toast.TextToastRecord; import com.android.server.notification.toast.ToastRecord; @@ -1934,10 +1935,20 @@ public class NotificationManagerService extends SystemService { hasSensitiveContent, lifespanMs); } - protected void logClassificationChannelAdjustmentReceived(boolean hasPosted, boolean isAlerting, - int classification, int lifespanMs) { + protected void logClassificationChannelAdjustmentReceived(NotificationRecord r, + boolean hasPosted, + int classification) { + // Note that this value of isAlerting does not fully indicate whether a notif + // would make a sound or HUN on device; it is an approximation for metrics. + boolean isAlerting = r.getChannel().getImportance() >= IMPORTANCE_DEFAULT; + int instanceId = r.getSbn().getInstanceId() == null + ? 0 : r.getSbn().getInstanceId().getId(); + FrameworkStatsLog.write(FrameworkStatsLog.NOTIFICATION_CHANNEL_CLASSIFICATION, - hasPosted, isAlerting, classification, lifespanMs); + hasPosted, isAlerting, classification, + r.getLifespanMs(System.currentTimeMillis()), + NotificationReportedEvent.NOTIFICATION_ADJUSTED.getId(), + instanceId, r.getUid()); } protected final BroadcastReceiver mLocaleChangeReceiver = new BroadcastReceiver() { @@ -7052,11 +7063,8 @@ public class NotificationManagerService extends SystemService { int classification = adjustments.getInt(KEY_TYPE); // swap app provided type with the real thing adjustments.putParcelable(KEY_TYPE, newChannel); - // Note that this value of isAlerting does not fully indicate whether a notif - // would make a sound or HUN on device; it is an approximation for metrics. - boolean isAlerting = r.getChannel().getImportance() >= IMPORTANCE_DEFAULT; - logClassificationChannelAdjustmentReceived(isPosted, isAlerting, classification, - r.getLifespanMs(System.currentTimeMillis())); + + logClassificationChannelAdjustmentReceived(r, isPosted, classification); } } r.addAdjustment(adjustment); diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java index c09077e349fd..f17ac5c92889 100644 --- a/services/core/java/com/android/server/notification/NotificationUsageStats.java +++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java @@ -21,6 +21,7 @@ import android.content.Context; import android.os.Handler; import android.os.Message; import android.os.SystemClock; +import android.service.notification.RateEstimator; import android.text.TextUtils; import android.util.ArraySet; import android.util.Log; diff --git a/services/core/java/com/android/server/pm/BroadcastHelper.java b/services/core/java/com/android/server/pm/BroadcastHelper.java index d78e98bf8e61..676c6fa4f138 100644 --- a/services/core/java/com/android/server/pm/BroadcastHelper.java +++ b/services/core/java/com/android/server/pm/BroadcastHelper.java @@ -53,6 +53,7 @@ import android.os.Handler; import android.os.PowerExemptionManager; import android.os.Process; import android.os.RemoteException; +import android.os.Trace; import android.os.UserHandle; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; @@ -358,9 +359,14 @@ public final class BroadcastHelper { @Nullable int[] instantUserIds, @Nullable SparseArray<int[]> broadcastAllowList, @NonNull AndroidPackage pkg, - @NonNull String[] sharedUidPackages) { + @NonNull String[] sharedUidPackages, + @NonNull String reasonForTrace) { final boolean isForWholeApp = componentNames.contains(packageName); if (isForWholeApp || !android.content.pm.Flags.reduceBroadcastsForComponentStateChanges()) { + tracePackageChangedBroadcastEvent( + android.content.pm.Flags.reduceBroadcastsForComponentStateChanges(), + reasonForTrace, packageName, "<implicit>" /* targetPackageName */, + "whole" /* targetComponent */, componentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */); @@ -382,6 +388,9 @@ public final class BroadcastHelper { // First, send the PACKAGE_CHANGED broadcast to the system. if (!TextUtils.equals(packageName, "android")) { + tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, + "android" /* targetPackageName */, "notExported" /* targetComponent */, + notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, "android" /* targetPackageName */, @@ -390,6 +399,9 @@ public final class BroadcastHelper { } // Second, send the PACKAGE_CHANGED broadcast to the application itself. + tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, + packageName /* targetPackageName */, "notExported" /* targetComponent */, + notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, packageName /* targetPackageName */, @@ -401,6 +413,9 @@ public final class BroadcastHelper { if (TextUtils.equals(packageName, sharedPackage)) { continue; } + tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, + sharedPackage /* targetPackageName */, "notExported" /* targetComponent */, + notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, sharedPackage /* targetPackageName */, @@ -410,6 +425,9 @@ public final class BroadcastHelper { } if (!exportedComponentNames.isEmpty()) { + tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, + "<implicit>" /* targetPackageName */, "exported" /* targetComponent */, + exportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, exportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, @@ -751,7 +769,8 @@ public final class BroadcastHelper { sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), - pkg.getUid(), null); + pkg.getUid(), null /* reason */, + "static_shared_library_changed" /* reasonForTrace */); } } } @@ -942,7 +961,8 @@ public final class BroadcastHelper { boolean dontKillApp, @NonNull ArrayList<String> componentNames, int packageUid, - @NonNull String reason) { + @NonNull String reason, + @NonNull String reasonForTrace) { PackageStateInternal setting = snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID); if (setting == null || setting.getPkg() == null) { @@ -960,7 +980,7 @@ public final class BroadcastHelper { mHandler.post(() -> sendPackageChangedBroadcastInternal( packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, setting.getPkg(), - sharedUserPackages)); + sharedUserPackages, reasonForTrace)); mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); } @@ -1253,4 +1273,25 @@ public final class BroadcastHelper { mPackageMonitorCallbackHelper.notifyResourcesChanged(mediaStatus, replacing, pkgNames, uids, mHandler); } + + private static void tracePackageChangedBroadcastEvent(boolean applyFlag, + @NonNull String reasonForTrace, @Nullable String packageName, + @Nullable String targetPackageName, @Nullable String targetComponent, + int componentSize) { + + if (!Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + return; + } + + final StringBuilder builder = new StringBuilder(); + builder.append("broadcastPackageChanged; "); + builder.append("af="); builder.append(applyFlag); + builder.append(",rft="); builder.append(reasonForTrace); + builder.append(",pn="); builder.append(packageName); + builder.append(",tpn="); builder.append(targetPackageName); + builder.append(",tc="); builder.append(targetComponent); + builder.append(",cs="); builder.append(componentSize); + + Trace.instant(Trace.TRACE_TAG_SYSTEM_SERVER, builder.toString()); + } } diff --git a/services/core/java/com/android/server/pm/InstallDependencyHelper.java b/services/core/java/com/android/server/pm/InstallDependencyHelper.java index c0ddebeb9868..837adf004df7 100644 --- a/services/core/java/com/android/server/pm/InstallDependencyHelper.java +++ b/services/core/java/com/android/server/pm/InstallDependencyHelper.java @@ -78,24 +78,22 @@ public class InstallDependencyHelper { mPackageInstallerService = packageInstallerService; } - void resolveLibraryDependenciesIfNeeded(PackageLite pkg, Computer snapshot, int userId, - Handler handler, OutcomeReceiver<Void, PackageManagerException> origCallback) { + void resolveLibraryDependenciesIfNeeded(List<SharedLibraryInfo> missingLibraries, + PackageLite pkg, Computer snapshot, int userId, Handler handler, + OutcomeReceiver<Void, PackageManagerException> origCallback) { CallOnceProxy callback = new CallOnceProxy(handler, origCallback); try { - resolveLibraryDependenciesIfNeededInternal(pkg, snapshot, userId, handler, callback); - } catch (PackageManagerException e) { - callback.onError(e); + resolveLibraryDependenciesIfNeededInternal( + missingLibraries, pkg, snapshot, userId, handler, callback); } catch (Exception e) { onError(callback, e.getMessage()); } } - private void resolveLibraryDependenciesIfNeededInternal(PackageLite pkg, Computer snapshot, - int userId, Handler handler, CallOnceProxy callback) throws PackageManagerException { - final List<SharedLibraryInfo> missing = - mSharedLibraries.collectMissingSharedLibraryInfos(pkg); - + private void resolveLibraryDependenciesIfNeededInternal(List<SharedLibraryInfo> missing, + PackageLite pkg, Computer snapshot, int userId, Handler handler, + CallOnceProxy callback) { if (missing.isEmpty()) { if (DEBUG) { Slog.d(TAG, "No missing dependency for " + pkg.getPackageName()); @@ -129,6 +127,11 @@ public class InstallDependencyHelper { } } + List<SharedLibraryInfo> getMissingSharedLibraries(PackageLite pkg) + throws PackageManagerException { + return mSharedLibraries.collectMissingSharedLibraryInfos(pkg); + } + void notifySessionComplete(int sessionId) { if (DEBUG) { Slog.d(TAG, "Session complete for " + sessionId); diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 183ceaecb70e..b48b39c2edd5 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -2983,7 +2983,7 @@ final class InstallPackageHelper { } } - public void sendPendingBroadcasts() { + public void sendPendingBroadcasts(String reasonForTrace) { String[] packages; ArrayList<String>[] components; int numBroadcasts = 0, numUsers; @@ -3027,7 +3027,8 @@ final class InstallPackageHelper { // Send broadcasts for (int i = 0; i < numBroadcasts; i++) { mBroadcastHelper.sendPackageChangedBroadcast(snapshot, packages[i], - true /* dontKillApp */, components[i], uids[i], null /* reason */); + true /* dontKillApp */, components[i], uids[i], null /* reason */, + reasonForTrace); } } diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java index b0fe3a97af6e..c96c160deb0f 100644 --- a/services/core/java/com/android/server/pm/InstallRequest.java +++ b/services/core/java/com/android/server/pm/InstallRequest.java @@ -170,6 +170,8 @@ final class InstallRequest { private final boolean mHasAppMetadataFileFromInstaller; private boolean mKeepArtProfile = false; + private final boolean mDependencyInstallerEnabled; + private final int mMissingSharedLibraryCount; // New install InstallRequest(InstallingSession params) { @@ -190,6 +192,8 @@ final class InstallRequest { mRequireUserAction = params.mRequireUserAction; mPreVerifiedDomains = params.mPreVerifiedDomains; mHasAppMetadataFileFromInstaller = params.mHasAppMetadataFile; + mDependencyInstallerEnabled = params.mDependencyInstallerEnabled; + mMissingSharedLibraryCount = params.mMissingSharedLibraryCount; } // Install existing package as user @@ -209,6 +213,8 @@ final class InstallRequest { mInstallerUidForInstallExisting = installerUid; mSystem = isSystem; mHasAppMetadataFileFromInstaller = false; + mDependencyInstallerEnabled = false; + mMissingSharedLibraryCount = 0; } // addForInit @@ -231,6 +237,8 @@ final class InstallRequest { mRequireUserAction = USER_ACTION_UNSPECIFIED; mDisabledPs = disabledPs; mHasAppMetadataFileFromInstaller = false; + mDependencyInstallerEnabled = false; + mMissingSharedLibraryCount = 0; } @Nullable @@ -1069,4 +1077,12 @@ final class InstallRequest { boolean isKeepArtProfile() { return mKeepArtProfile; } + + int getMissingSharedLibraryCount() { + return mMissingSharedLibraryCount; + } + + boolean isDependencyInstallerEnabled() { + return mDependencyInstallerEnabled; + } } diff --git a/services/core/java/com/android/server/pm/InstallingSession.java b/services/core/java/com/android/server/pm/InstallingSession.java index ccc117566989..6a2bf83ba368 100644 --- a/services/core/java/com/android/server/pm/InstallingSession.java +++ b/services/core/java/com/android/server/pm/InstallingSession.java @@ -103,6 +103,8 @@ class InstallingSession { final DomainSet mPreVerifiedDomains; final boolean mHasAppMetadataFile; @Nullable final String mDexoptCompilerFilter; + final boolean mDependencyInstallerEnabled; + final int mMissingSharedLibraryCount; // For move install InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer, @@ -138,13 +140,16 @@ class InstallingSession { mPreVerifiedDomains = null; mHasAppMetadataFile = false; mDexoptCompilerFilter = null; + mDependencyInstallerEnabled = false; + mMissingSharedLibraryCount = 0; } InstallingSession(int sessionId, File stagedDir, IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams, InstallSource installSource, UserHandle user, SigningDetails signingDetails, int installerUid, PackageLite packageLite, DomainSet preVerifiedDomains, PackageManagerService pm, - boolean hasAppMetadatafile) { + boolean hasAppMetadatafile, boolean dependencyInstallerEnabled, + int missingSharedLibraryCount) { mPm = pm; mUser = user; mOriginInfo = OriginInfo.fromStagedFile(stagedDir); @@ -175,6 +180,8 @@ class InstallingSession { mPreVerifiedDomains = preVerifiedDomains; mHasAppMetadataFile = hasAppMetadatafile; mDexoptCompilerFilter = sessionParams.dexoptCompilerFilter; + mDependencyInstallerEnabled = dependencyInstallerEnabled; + mMissingSharedLibraryCount = missingSharedLibraryCount; } @Override diff --git a/services/core/java/com/android/server/pm/PackageHandler.java b/services/core/java/com/android/server/pm/PackageHandler.java index 4ea405441030..0a067048be42 100644 --- a/services/core/java/com/android/server/pm/PackageHandler.java +++ b/services/core/java/com/android/server/pm/PackageHandler.java @@ -76,7 +76,7 @@ final class PackageHandler extends Handler { void doHandleMessage(Message msg) { switch (msg.what) { case SEND_PENDING_BROADCAST: { - mPm.sendPendingBroadcasts(); + mPm.sendPendingBroadcasts((String) msg.obj); break; } case POST_INSTALL: { diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 891d66a5d238..c6760431116e 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -31,6 +31,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STOR import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; import static android.content.pm.PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE; +import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY; import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SPLIT; import static android.content.pm.PackageManager.INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE; import static android.content.pm.PackageManager.INSTALL_FAILED_SESSION_INVALID; @@ -109,6 +110,7 @@ import android.content.pm.PackageInstaller.UserActionReason; import android.content.pm.PackageManager; import android.content.pm.PackageManager.PackageInfoFlags; import android.content.pm.PackageManagerInternal; +import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.dex.DexMetadataHelper; import android.content.pm.parsing.ApkLite; @@ -540,6 +542,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @GuardedBy("mLock") private DomainSet mPreVerifiedDomains; + private AtomicBoolean mDependencyInstallerEnabled = new AtomicBoolean(); + private AtomicInteger mMissingSharedLibraryCount = new AtomicInteger(); + static class FileEntry { private final int mIndex; private final InstallationFile mFile; @@ -3232,6 +3237,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (Flags.sdkDependencyInstaller() && params.isAutoInstallDependenciesEnabled && !isMultiPackage()) { + mDependencyInstallerEnabled.set(true); resolveLibraryDependenciesIfNeeded(); } else { install(); @@ -3241,8 +3247,20 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private void resolveLibraryDependenciesIfNeeded() { synchronized (mLock) { - mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(mPackageLite, - mPm.snapshotComputer(), userId, mHandler, + List<SharedLibraryInfo> missingLibraries = new ArrayList<>(); + try { + missingLibraries = mInstallDependencyHelper.getMissingSharedLibraries(mPackageLite); + } catch (PackageManagerException e) { + handleDependencyResolutionFailure(e); + } catch (Exception e) { + handleDependencyResolutionFailure( + new PackageManagerException( + INSTALL_FAILED_MISSING_SHARED_LIBRARY, e.getMessage())); + } + + mMissingSharedLibraryCount.set(missingLibraries.size()); + mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(missingLibraries, + mPackageLite, mPm.snapshotComputer(), userId, mHandler, new OutcomeReceiver<>() { @Override @@ -3252,14 +3270,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @Override public void onError(@NonNull PackageManagerException e) { - final String completeMsg = ExceptionUtils.getCompleteMessage(e); - setSessionFailed(e.error, completeMsg); - onSessionDependencyResolveFailure(e.error, completeMsg); + handleDependencyResolutionFailure(e); } }); } } + private void handleDependencyResolutionFailure(@NonNull PackageManagerException e) { + final String completeMsg = ExceptionUtils.getCompleteMessage(e); + setSessionFailed(e.error, completeMsg); + onSessionDependencyResolveFailure(e.error, completeMsg); + PackageMetrics.onDependencyInstallationFailure( + sessionId, getPackageName(), e.error, mInstallerUid, params, + mMissingSharedLibraryCount.get()); + } + /** * Stages this session for install and returns a * {@link InstallingSession} representing this new staged state. @@ -3327,7 +3352,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { synchronized (mLock) { return new InstallingSession(sessionId, stageDir, localObserver, params, mInstallSource, user, mSigningDetails, mInstallerUid, mPackageLite, mPreVerifiedDomains, mPm, - mHasAppMetadataFile); + mHasAppMetadataFile, mDependencyInstallerEnabled.get(), + mMissingSharedLibraryCount.get()); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index fd0a90c5833a..a0bbc454c10b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3020,6 +3020,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService mDexOptHelper.performPackageDexOptUpgradeIfNeeded(); } + public void updateMetricsIfNeeded() { + final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); + if (displayManager != null) { + final Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY); + if (display != null) { + display.getMetrics(mMetrics); + } + } + } + private void notifyPackageUseInternal(String packageName, int reason) { long time = System.currentTimeMillis(); synchronized (mLock) { @@ -3531,7 +3541,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponents(userId, packageName, updatedComponents); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { - mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY); + mHandler.sendMessageDelayed( + mHandler.obtainMessage(SEND_PENDING_BROADCAST, + "reset_component_state_changed" /* obj */), + BROADCAST_DELAY); } } @@ -3828,7 +3841,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponent(userId, componentPkgName, componentName.getClassName()); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { - mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY); + mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, + "component_label_icon_changed" /* obj */), BROADCAST_DELAY); } } @@ -4087,7 +4101,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long broadcastDelay = SystemClock.uptimeMillis() > mServiceStartWithDelay ? BROADCAST_DELAY : BROADCAST_DELAY_DURING_STARTUP; - mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, broadcastDelay); + mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, + "component_state_changed" /* obj */), broadcastDelay); } } } @@ -4105,7 +4120,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int packageUid = UserHandle.getUid( userId, pkgSettings.get(packageName).getAppId()); mBroadcastHelper.sendPackageChangedBroadcast(newSnapshot, packageName, - false /* dontKillApp */, components, packageUid, null /* reason */); + false /* dontKillApp */, components, packageUid, null /* reason */, + "component_state_changed" /* reasonForTrace */); } } finally { Binder.restoreCallingIdentity(callingId); @@ -4333,7 +4349,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService true /* dontKillApp */, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), - Intent.ACTION_OVERLAY_CHANGED); + Intent.ACTION_OVERLAY_CHANGED, "overlay_changed" /* reasonForTrace */); } }, overlayFilter); @@ -6384,7 +6400,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (pkgUserState != null && pkgUserState.isInstalled()) { final int packageUid = UserHandle.getUid(userIds[i], appId); mBroadcastHelper.sendPackageChangedBroadcast(snapShot, packageName, - true /* dontKillApp */, components, packageUid, reason); + true /* dontKillApp */, components, packageUid, reason, + "mime_group_changed" /* reasonForTrace */); } } }); @@ -8179,8 +8196,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mRemovePackageHelper.cleanUpForMoveInstall(volumeUuid, packageName, fromCodePath); } - void sendPendingBroadcasts() { - mInstallPackageHelper.sendPendingBroadcasts(); + void sendPendingBroadcasts(String reasonForTrace) { + mInstallPackageHelper.sendPendingBroadcasts(reasonForTrace); } void handlePackagePostInstall(@NonNull InstallRequest request, boolean launchedForRestore) { diff --git a/services/core/java/com/android/server/pm/PackageMetrics.java b/services/core/java/com/android/server/pm/PackageMetrics.java index 0acadb129f2b..856d6a726da5 100644 --- a/services/core/java/com/android/server/pm/PackageMetrics.java +++ b/services/core/java/com/android/server/pm/PackageMetrics.java @@ -32,7 +32,9 @@ import android.app.admin.SecurityLog; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.pm.DataLoaderType; import android.content.pm.Flags; +import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.parsing.ApkLiteParseUtils; @@ -173,7 +175,10 @@ final class PackageMetrics { mInstallRequest.isInstallInherit() /* is_inherit */, mInstallRequest.isInstallForUsers() /* is_installing_existing_as_user */, mInstallRequest.isInstallMove() /* is_move_install */, - false /* is_staged */ + false /* is_staged */, + mInstallRequest + .isDependencyInstallerEnabled() /* is_install_dependencies_enabled */, + mInstallRequest.getMissingSharedLibraryCount() /* missing_dependencies_count */ ); } @@ -323,7 +328,53 @@ final class PackageMetrics { verifyingSession.isInherit() /* is_inherit */, false /* is_installing_existing_as_user */, false /* is_move_install */, - verifyingSession.isStaged() /* is_staged */ + verifyingSession.isStaged() /* is_staged */, + false /* is_install_dependencies_enabled */, + 0 /* missing_dependencies_count */ + ); + } + + static void onDependencyInstallationFailure( + int sessionId, String packageName, int errorCode, int installerPackageUid, + PackageInstaller.SessionParams params, int missingDependenciesCount) { + if (params == null) { + return; + } + int dataLoaderType = DataLoaderType.NONE; + if (params.dataLoaderParams != null) { + dataLoaderType = params.dataLoaderParams.getType(); + } + + FrameworkStatsLog.write(FrameworkStatsLog.PACKAGE_INSTALLATION_SESSION_REPORTED, + sessionId /* session_id */, + packageName /* package_name */, + INVALID_UID /* uid */, + null /* user_ids */, + null /* user_types */, + null /* original_user_ids */, + null /* original_user_types */, + errorCode /* public_return_code */, + 0 /* internal_error_code */, + 0 /* apks_size_bytes */, + 0 /* version_code */, + null /* install_steps */, + null /* step_duration_millis */, + 0 /* total_duration_millis */, + 0 /* install_flags */, + installerPackageUid /* installer_package_uid */, + INVALID_UID /* original_installer_package_uid */, + dataLoaderType /* data_loader_type */, + params.requireUserAction /* user_action_required_type */, + (params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0 /* is_instant */, + false /* is_replace */, + false /* is_system */, + params.mode + == PackageInstaller.SessionParams.MODE_INHERIT_EXISTING /* is_inherit */, + false /* is_installing_existing_as_user */, + false /* is_move_install */, + params.isStaged /* is_staged */, + true /* is_install_dependencies_enabled */, + missingDependenciesCount /* missing_dependencies_count */ ); } diff --git a/services/core/java/com/android/server/pm/VerifyingSession.java b/services/core/java/com/android/server/pm/VerifyingSession.java index 542ae8eb9207..dd60a155f2fb 100644 --- a/services/core/java/com/android/server/pm/VerifyingSession.java +++ b/services/core/java/com/android/server/pm/VerifyingSession.java @@ -16,11 +16,7 @@ package com.android.server.pm; -import static android.content.Intent.EXTRA_LONG_VERSION_CODE; -import static android.content.Intent.EXTRA_PACKAGE_NAME; -import static android.content.Intent.EXTRA_VERSION_CODE; import static android.content.pm.PackageInstaller.SessionParams.MODE_INHERIT_EXISTING; -import static android.content.pm.PackageManager.EXTRA_VERIFICATION_ID; import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import static android.content.pm.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4; @@ -40,9 +36,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppOpsManager; import android.app.BroadcastOptions; -import android.content.BroadcastReceiver; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.DataLoaderType; @@ -68,7 +62,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.incremental.IncrementalManager; import android.provider.DeviceConfig; -import android.provider.Settings; import android.text.TextUtils; import android.util.Pair; import android.util.Slog; diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java index ecffd382f542..3f9144f0d980 100644 --- a/services/core/java/com/android/server/policy/AppOpsPolicy.java +++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java @@ -136,7 +136,8 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat final LocationManagerInternal locationManagerInternal = LocalServices.getService( LocationManagerInternal.class); - locationManagerInternal.setLocationPackageTagsListener( + if (locationManagerInternal != null) { + locationManagerInternal.setLocationPackageTagsListener( (uid, packageTagsList) -> { synchronized (mLock) { if (packageTagsList.isEmpty()) { @@ -158,6 +159,7 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat mLocationTags); } }); + } final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index d5e4c3f1eb9f..c4d1cc723804 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -88,12 +88,10 @@ import static com.android.hardware.input.Flags.enableTalkbackAndMagnifierKeyGest import static com.android.hardware.input.Flags.inputManagerLifecycleSupport; import static com.android.hardware.input.Flags.keyboardA11yShortcutControl; import static com.android.hardware.input.Flags.modifierShortcutDump; -import static com.android.hardware.input.Flags.overridePowerKeyBehaviorInFocusedWindow; import static com.android.hardware.input.Flags.useKeyGestureEventHandler; -import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY; -import static com.android.server.GestureLauncherService.DOUBLE_POWER_TAP_COUNT_THRESHOLD; import static com.android.server.flags.Flags.modifierShortcutManagerMultiuser; import static com.android.server.flags.Flags.newBugreportKeyboardShortcut; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED; @@ -434,16 +432,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { "android.intent.action.VOICE_ASSIST_RETAIL"; /** - * Maximum amount of time in milliseconds between consecutive power onKeyDown events to be - * considered a multi-press, only used for the power button. - * Note: To maintain backwards compatibility for the power button, we are measuring the times - * between consecutive down events instead of the first tap's up event and the second tap's - * down event. - */ - @VisibleForTesting public static final int POWER_MULTI_PRESS_TIMEOUT_MILLIS = - ViewConfiguration.getMultiPressTimeout(); - - /** * Lock protecting internal state. Must not call out into window * manager with lock held. (This lock will be acquired in places * where the window manager is calling in with its own lock held.) @@ -504,32 +492,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { private WindowWakeUpPolicy mWindowWakeUpPolicy; - /** - * The three variables below are used for custom power key gesture detection in - * PhoneWindowManager. They are used to detect when the power button has been double pressed - * and, when it does happen, makes the behavior overrideable by the app. - * - * We cannot use the {@link PowerKeyRule} for this because multi-press power gesture detection - * and behaviors are handled by {@link com.android.server.GestureLauncherService}, and the - * {@link PowerKeyRule} only handles single and long-presses of the power button. As a result, - * overriding the double tap behavior requires custom gesture detection here that mimics the - * logic in {@link com.android.server.GestureLauncherService}. - * - * Long-term, it would be beneficial to move all power gesture detection to - * {@link PowerKeyRule} so that this custom logic isn't required. - */ - // Time of last power down event. - private long mLastPowerDown; - - // Number of power button events consecutively triggered (within a specific timeout threshold). - private int mPowerButtonConsecutiveTaps = 0; - - // Whether a double tap of the power button has been detected. - volatile boolean mDoubleTapPowerDetected; - - // Runnable that is queued on a delay when the first power keyDown event is sent to the app. - private Runnable mPowerKeyDelayedRunnable = null; - boolean mSafeMode; // Whether to allow dock apps with METADATA_DOCK_HOME to temporarily take over the Home key. @@ -1135,11 +1097,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { mPowerKeyHandled = mPowerKeyHandled || hungUp || handledByPowerManager || isKeyGestureTriggered || mKeyCombinationManager.isPowerKeyIntercepted(); - - if (overridePowerKeyBehaviorInFocusedWindow()) { - mPowerKeyHandled |= mDoubleTapPowerDetected; - } - if (!mPowerKeyHandled) { if (!interactive) { wakeUpFromWakeKey(event); @@ -2712,19 +2669,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mShouldEarlyShortPressOnPower) { return; } - // TODO(b/380433365): Remove deferring single power press action when refactoring. - if (overridePowerKeyBehaviorInFocusedWindow()) { - mDeferredKeyActionExecutor.cancelQueuedAction(KEYCODE_POWER); - mDeferredKeyActionExecutor.queueKeyAction( - KEYCODE_POWER, - downTime, - () -> { - powerPress(downTime, 1 /*count*/, displayId); - }); - } else { - powerPress(downTime, 1 /*count*/, displayId); - } - + powerPress(downTime, 1 /*count*/, displayId); } @Override @@ -2755,17 +2700,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onMultiPress(long downTime, int count, int displayId) { - if (overridePowerKeyBehaviorInFocusedWindow()) { - mDeferredKeyActionExecutor.cancelQueuedAction(KEYCODE_POWER); - mDeferredKeyActionExecutor.queueKeyAction( - KEYCODE_POWER, - downTime, - () -> { - powerPress(downTime, count, displayId); - }); - } else { - powerPress(downTime, count, displayId); - } + powerPress(downTime, count, displayId); } @Override @@ -3542,12 +3477,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - if (overridePowerKeyBehaviorInFocusedWindow() && event.getKeyCode() == KEYCODE_POWER - && event.getAction() == KeyEvent.ACTION_UP - && mDoubleTapPowerDetected) { - mDoubleTapPowerDetected = false; - } - return needToConsumeKey ? keyConsumed : keyNotConsumed; } @@ -3647,7 +3576,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } break; case KeyEvent.KEYCODE_I: - if (firstDown && event.isMetaPressed()) { + if (firstDown && event.isMetaPressed() && isUserSetupComplete() && !keyguardOn) { showSystemSettings(); notifyKeyGestureCompleted(event, KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS); @@ -4063,8 +3992,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { sendSystemKeyToStatusBarAsync(event); return true; } - case KeyEvent.KEYCODE_POWER: - return interceptPowerKeyBeforeDispatching(focusedToken, event); case KeyEvent.KEYCODE_SCREENSHOT: if (firstDown) { interceptScreenshotChord(SCREENSHOT_KEY_OTHER, 0 /*pressDelay*/); @@ -4120,8 +4047,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { sendSystemKeyToStatusBarAsync(event); return true; } - case KeyEvent.KEYCODE_POWER: - return interceptPowerKeyBeforeDispatching(focusedToken, event); } if (isValidGlobalKey(keyCode) && mGlobalKeyManager.handleGlobalKey(mContext, keyCode, event)) { @@ -4132,90 +4057,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { return (metaState & KeyEvent.META_META_ON) != 0; } - /** - * Called by interceptKeyBeforeDispatching to handle interception logic for KEYCODE_POWER - * KeyEvents. - * - * @return true if intercepting the key, false if sending to app. - */ - private boolean interceptPowerKeyBeforeDispatching(IBinder focusedToken, KeyEvent event) { - if (!overridePowerKeyBehaviorInFocusedWindow()) { - //Flag disabled: intercept the power key and do not send to app. - return true; - } - if (event.getKeyCode() != KEYCODE_POWER) { - Log.wtf(TAG, "interceptPowerKeyBeforeDispatching received a non-power KeyEvent " - + "with key code: " + event.getKeyCode()); - return false; - } - - // Intercept keys (don't send to app) for 3x, 4x, 5x gestures) - if (mPowerButtonConsecutiveTaps > DOUBLE_POWER_TAP_COUNT_THRESHOLD) { - setDeferredKeyActionsExecutableAsync(KEYCODE_POWER, event.getDownTime()); - return true; - } - - // UP key; just reuse the original decision. - if (event.getAction() == KeyEvent.ACTION_UP) { - final Set<Integer> consumedKeys = mConsumedKeysForDevice.get(event.getDeviceId()); - return consumedKeys != null - && consumedKeys.contains(event.getKeyCode()); - } - - KeyInterceptionInfo info = - mWindowManagerInternal.getKeyInterceptionInfoFromToken(focusedToken); - - if (info == null || !mButtonOverridePermissionChecker.canWindowOverridePowerKey(mContext, - info.windowOwnerUid, info.inputFeaturesFlags)) { - // The focused window does not have the permission to override power key behavior. - if (DEBUG_INPUT) { - String interceptReason = ""; - if (info == null) { - interceptReason = "Window is null"; - } else if (!mButtonOverridePermissionChecker.canAppOverrideSystemKey(mContext, - info.windowOwnerUid)) { - interceptReason = "Application does not have " - + "OVERRIDE_SYSTEM_KEY_BEHAVIOR_IN_FOCUSED_WINDOW permission"; - } else { - interceptReason = "Window does not have inputFeatureFlag set"; - } - - Log.d(TAG, String.format("Intercepting KEYCODE_POWER event. action=%d, " - + "eventTime=%d to window=%s. interceptReason=%s. " - + "mDoubleTapPowerDetected=%b", - event.getAction(), event.getEventTime(), (info != null) - ? info.windowTitle : "null", interceptReason, - mDoubleTapPowerDetected)); - } - // Intercept the key (i.e. do not send to app) - setDeferredKeyActionsExecutableAsync(KEYCODE_POWER, event.getDownTime()); - return true; - } - - if (DEBUG_INPUT) { - Log.d(TAG, String.format("Sending KEYCODE_POWER to app. action=%d, " - + "eventTime=%d to window=%s. mDoubleTapPowerDetected=%b", - event.getAction(), event.getEventTime(), info.windowTitle, - mDoubleTapPowerDetected)); - } - - if (!mDoubleTapPowerDetected) { - //Single press: post a delayed runnable for the single press power action that will be - // called if it's not cancelled by a double press. - final var downTime = event.getDownTime(); - mPowerKeyDelayedRunnable = () -> - setDeferredKeyActionsExecutableAsync(KEYCODE_POWER, downTime); - mHandler.postDelayed(mPowerKeyDelayedRunnable, POWER_MULTI_PRESS_TIMEOUT_MILLIS); - } else if (mPowerKeyDelayedRunnable != null) { - //Double press detected: cancel the single press runnable. - mHandler.removeCallbacks(mPowerKeyDelayedRunnable); - mPowerKeyDelayedRunnable = null; - } - - // Focused window has permission. Send to app. - return false; - } - @SuppressLint("MissingPermission") private void initKeyGestures() { if (!useKeyGestureEventHandler()) { @@ -4265,6 +4106,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT: case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS: case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION: + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: return true; case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD: case KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD: @@ -4279,18 +4121,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { .isAccessibilityShortcutAvailable(false); case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK: return enableTalkbackAndMagnifierKeyGestures(); - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: - return InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() - && keyboardA11yShortcutControl(); - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: - return InputSettings.isAccessibilityBounceKeysFeatureEnabled() - && keyboardA11yShortcutControl(); - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: - return InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() - && keyboardA11yShortcutControl(); - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: - return InputSettings.isAccessibilityStickyKeysFeatureEnabled() - && keyboardA11yShortcutControl(); default: return false; } @@ -4308,6 +4138,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { int displayId = event.getDisplayId(); int modifierState = event.getModifierState(); boolean keyguardOn = keyguardOn(); + boolean canLaunchApp = isUserSetupComplete() && !keyguardOn; switch (gestureType) { case KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS: if (complete) { @@ -4325,7 +4156,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return true; case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT: case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT: - if (complete) { + if (complete && canLaunchApp) { launchAssistAction(Intent.EXTRA_ASSIST_INPUT_HINT_KEYBOARD, deviceId, SystemClock.uptimeMillis(), AssistUtils.INVOCATION_TYPE_UNKNOWN); @@ -4338,7 +4169,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } return true; case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS: - if (complete) { + if (complete && canLaunchApp) { showSystemSettings(); } return true; @@ -4441,7 +4272,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } return true; case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH: - if (complete) { + if (complete && canLaunchApp) { launchTargetSearchActivity(); } return true; @@ -4522,63 +4353,20 @@ public class PhoneWindowManager implements WindowManagerPolicy { break; case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION: AppLaunchData data = event.getAppLaunchData(); - if (complete && isUserSetupComplete() && !keyguardOn - && data != null && mModifierShortcutManager.launchApplication(data)) { + if (complete && canLaunchApp && data != null + && mModifierShortcutManager.launchApplication(data)) { dismissKeyboardShortcutsMenu(); } return true; - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: - if (InputSettings.isAccessibilityBounceKeysFeatureEnabled() - && keyboardA11yShortcutControl()) { - if (complete) { - final boolean bounceKeysEnabled = - InputSettings.isAccessibilityBounceKeysEnabled( - mContext); - InputSettings.setAccessibilityBounceKeysThreshold(mContext, - bounceKeysEnabled ? 0 - : InputSettings.DEFAULT_BOUNCE_KEYS_THRESHOLD_MILLIS); - } - return true; - } - break; - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: - if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() - && keyboardA11yShortcutControl()) { - if (complete) { - final boolean mouseKeysEnabled = - InputSettings.isAccessibilityMouseKeysEnabled( - mContext); - InputSettings.setAccessibilityMouseKeysEnabled(mContext, - !mouseKeysEnabled); - } - return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: + NotificationManager nm = getNotificationService(); + if (nm != null) { + boolean isEnabled = nm.getZenMode() != Settings.Global.ZEN_MODE_OFF; + nm.setZenMode(isEnabled ? Settings.Global.ZEN_MODE_OFF + : Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, + "Key gesture DND", true); } - break; - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: - if (InputSettings.isAccessibilityStickyKeysFeatureEnabled() - && keyboardA11yShortcutControl()) { - if (complete) { - final boolean stickyKeysEnabled = - InputSettings.isAccessibilityStickyKeysEnabled(mContext); - InputSettings.setAccessibilityStickyKeysEnabled(mContext, - !stickyKeysEnabled); - } - return true; - } - break; - case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: - if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() - && keyboardA11yShortcutControl()) { - if (complete) { - final boolean slowKeysEnabled = - InputSettings.isAccessibilitySlowKeysEnabled(mContext); - InputSettings.setAccessibilitySlowKeysThreshold(mContext, - slowKeysEnabled ? 0 - : InputSettings.DEFAULT_SLOW_KEYS_THRESHOLD_MILLIS); - } - return true; - } - break; + return true; } return false; } @@ -4792,11 +4580,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { return true; } - if (overridePowerKeyBehaviorInFocusedWindow() && keyCode == KEYCODE_POWER) { - handleUnhandledSystemKey(event); - return true; - } - if (useKeyGestureEventHandler()) { return false; } @@ -5631,13 +5414,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { KeyEvent.actionToString(event.getAction()), mPowerKeyHandled ? 1 : 0, mSingleKeyGestureDetector.getKeyPressCounter(KeyEvent.KEYCODE_POWER)); - if (overridePowerKeyBehaviorInFocusedWindow()) { - result |= ACTION_PASS_TO_USER; - } else { - // Any activity on the power button stops the accessibility shortcut - result &= ~ACTION_PASS_TO_USER; - } - + // Any activity on the power button stops the accessibility shortcut + result &= ~ACTION_PASS_TO_USER; isWakeKey = false; // wake-up will be handled separately if (down) { interceptPowerKeyDown(event, interactiveAndAwake, isKeyGestureTriggered); @@ -5899,35 +5677,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (event.getKeyCode() == KEYCODE_POWER && event.getAction() == KeyEvent.ACTION_DOWN) { - if (overridePowerKeyBehaviorInFocusedWindow()) { - if (event.getRepeatCount() > 0) { - return; - } - if (mGestureLauncherService != null) { - mGestureLauncherService.processPowerKeyDown(event); - } - - if (detectDoubleTapPower(event)) { - mDoubleTapPowerDetected = true; - - // Copy of the event for handler in case the original event gets recycled. - KeyEvent eventCopy = KeyEvent.obtain(event); - mDeferredKeyActionExecutor.queueKeyAction( - KeyEvent.KEYCODE_POWER, - eventCopy.getEventTime(), - () -> { - if (!handleCameraGesture(eventCopy, interactive)) { - mSingleKeyGestureDetector.interceptKey( - eventCopy, interactive, defaultDisplayOn); - } else { - mSingleKeyGestureDetector.reset(); - } - eventCopy.recycle(); - }); - return; - } - } - mPowerKeyHandled = handleCameraGesture(event, interactive); if (mPowerKeyHandled) { // handled by camera gesture. @@ -5939,25 +5688,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { mSingleKeyGestureDetector.interceptKey(event, interactive, defaultDisplayOn); } - private boolean detectDoubleTapPower(KeyEvent event) { - if (event.getKeyCode() != KEYCODE_POWER || event.getAction() != KeyEvent.ACTION_DOWN - || event.getRepeatCount() != 0) { - return false; - } - - final long powerTapInterval = event.getEventTime() - mLastPowerDown; - mLastPowerDown = event.getEventTime(); - if (powerTapInterval >= POWER_MULTI_PRESS_TIMEOUT_MILLIS) { - // Tap too slow for double press - mPowerButtonConsecutiveTaps = 1; - } else { - mPowerButtonConsecutiveTaps++; - } - - return powerTapInterval < POWER_MULTI_PRESS_TIMEOUT_MILLIS - && mPowerButtonConsecutiveTaps == DOUBLE_POWER_TAP_COUNT_THRESHOLD; - } - // The camera gesture will be detected by GestureLauncherService. private boolean handleCameraGesture(KeyEvent event, boolean interactive) { // camera gesture. @@ -7814,12 +7544,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { null) == PERMISSION_GRANTED; } - - boolean canWindowOverridePowerKey(Context context, int uid, int inputFeaturesFlags) { - return canAppOverrideSystemKey(context, uid) - && (inputFeaturesFlags & WindowManager.LayoutParams - .INPUT_FEATURE_RECEIVE_POWER_KEY_DOUBLE_PRESS) != 0; - } } private int getTargetDisplayIdForKeyEvent(KeyEvent event) { diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 36bc0b93cd7c..ce8dc69e4b26 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -7093,7 +7093,11 @@ public final class PowerManagerService extends SystemService if ((flags & PowerManager.GO_TO_SLEEP_FLAG_SOFT_SLEEP) != 0) { if (mFoldGracePeriodProvider.isEnabled()) { if (!powerGroup.hasWakeLockKeepingScreenOnLocked()) { + Slog.d(TAG, "Showing dismissible keyguard"); mNotifier.showDismissibleKeyguard(); + } else { + Slog.i(TAG, "There is a screen wake lock present: " + + "sleep request will be ignored"); } continue; // never actually goes to sleep for SOFT_SLEEP } else { diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java index 987a84994451..137ea0617f21 100644 --- a/services/core/java/com/android/server/power/hint/HintManagerService.java +++ b/services/core/java/com/android/server/power/hint/HintManagerService.java @@ -296,7 +296,11 @@ public final class HintManagerService extends SystemService { mPowerHalVersion = 0; mUsesFmq = false; if (mPowerHal != null) { - mSupportInfo = getSupportInfo(); + try { + mSupportInfo = getSupportInfo(); + } catch (RemoteException e) { + throw new IllegalStateException("Could not contact PowerHAL!", e); + } } mDefaultCpuHeadroomCalculationWindowMillis = new CpuHeadroomParamsInternal().calculationWindowMillis; @@ -314,7 +318,7 @@ public final class HintManagerService extends SystemService { } } - SupportInfo getSupportInfo() { + SupportInfo getSupportInfo() throws RemoteException { try { mPowerHalVersion = mPowerHal.getInterfaceVersion(); if (mPowerHalVersion >= 6) { @@ -325,9 +329,40 @@ public final class HintManagerService extends SystemService { } SupportInfo supportInfo = new SupportInfo(); + supportInfo.usesSessions = isHintSessionSupported(); + // Global boosts & modes aren't currently relevant for HMS clients + supportInfo.boosts = 0; + supportInfo.modes = 0; + supportInfo.sessionHints = 0; + supportInfo.sessionModes = 0; + supportInfo.sessionTags = 0; + supportInfo.headroom = new SupportInfo.HeadroomSupportInfo(); supportInfo.headroom.isCpuSupported = false; supportInfo.headroom.isGpuSupported = false; + if (isHintSessionSupported()) { + if (mPowerHalVersion == 4) { + // Assume we support the V4 hints & modes unless specified + // otherwise; this is to avoid breaking backwards compat + // since we historically just assumed they were. + supportInfo.sessionHints = 31; // first 5 bits are ones + } + if (mPowerHalVersion == 5) { + // Assume we support the V5 hints & modes unless specified + // otherwise; this is to avoid breaking backwards compat + // since we historically just assumed they were. + + // Hal V5 has 8 modes, all of which it assumes are supported, + // so we represent that by having the first 8 bits set + supportInfo.sessionHints = 255; // first 8 bits are ones + // Hal V5 has 1 mode which it assumes is supported, so we + // represent that by having the first bit set + supportInfo.sessionModes = 1; + // Hal V5 has 5 tags, all of which it assumes are supported, + // so we represent that by having the first 5 bits set + supportInfo.sessionTags = 31; + } + } return supportInfo; } @@ -1228,7 +1263,7 @@ public final class HintManagerService extends SystemService { @SessionTag int tag, SessionCreationConfig creationConfig, SessionConfig config) { if (!isHintSessionSupported()) { - throw new UnsupportedOperationException("PowerHAL is not supported!"); + throw new UnsupportedOperationException("PowerHintSessions are not supported!"); } java.util.Objects.requireNonNull(token); @@ -1424,12 +1459,6 @@ public final class HintManagerService extends SystemService { removeChannelItem(callingTgid, callingUid); }; - @Override - public long getHintSessionPreferredRate() { - return mHintSessionPreferredRate; - } - - @Override public int getMaxGraphicsPipelineThreadsCount() { return MAX_GRAPHICS_PIPELINE_THREADS_COUNT; } @@ -1561,6 +1590,16 @@ public final class HintManagerService extends SystemService { mSessionManager = ISessionManager.Stub.asInterface(sessionManager); } + public IHintManager.HintManagerClientData + registerClient(@NonNull IHintManager.IHintManagerClient clientBinder) { + IHintManager.HintManagerClientData out = new IHintManager.HintManagerClientData(); + out.preferredRateNanos = mHintSessionPreferredRate; + out.maxGraphicsPipelineThreads = getMaxGraphicsPipelineThreadsCount(); + out.powerHalVersion = mPowerHalVersion; + out.supportInfo = mSupportInfo; + return out; + } + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) { @@ -1568,7 +1607,7 @@ public final class HintManagerService extends SystemService { } pw.println("HintSessionPreferredRate: " + mHintSessionPreferredRate); pw.println("MaxGraphicsPipelineThreadsCount: " + MAX_GRAPHICS_PIPELINE_THREADS_COUNT); - pw.println("HAL Support: " + isHintSessionSupported()); + pw.println("Hint Session Support: " + isHintSessionSupported()); pw.println("Active Sessions:"); synchronized (mLock) { for (int i = 0; i < mActiveSessions.size(); i++) { diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java index 6f1810711b3a..fe14f6b172f1 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -5723,7 +5723,9 @@ public class BatteryStatsImpl extends BatteryStats { displayStats.screenDozeTimer.stopRunningLocked(elapsedRealtimeMs); shouldScheduleSync = true; break; - case Display.STATE_OFF: // fallthrough + case Display.STATE_OFF: + shouldScheduleSync = true; + break; case Display.STATE_UNKNOWN: // Not tracked by timers. break; @@ -5756,7 +5758,9 @@ public class BatteryStatsImpl extends BatteryStats { displayStats.screenDozeTimer.startRunningLocked(elapsedRealtimeMs); shouldScheduleSync = true; break; - case Display.STATE_OFF: // fallthrough + case Display.STATE_OFF: + shouldScheduleSync = true; + break; case Display.STATE_UNKNOWN: // Not tracked by timers. break; @@ -5873,7 +5877,7 @@ public class BatteryStatsImpl extends BatteryStats { if (shouldScheduleSync) { if (mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_SCREEN)) { - mScreenPowerStatsCollector.schedule(); + mScreenPowerStatsCollector.onScreenStateChange(); } else { final int numDisplays = mPerDisplayBatteryStats.length; final int[] displayStates = new int[numDisplays]; @@ -11443,7 +11447,7 @@ public class BatteryStatsImpl extends BatteryStats { mWifiPowerStatsCollector.addConsumer(this::recordPowerStats); mBluetoothPowerStatsCollector = new BluetoothPowerStatsCollector( - mPowerStatsCollectorInjector); + mPowerStatsCollectorInjector, this::onBluetoothPowerStatsRetrieved); mBluetoothPowerStatsCollector.addConsumer(this::recordPowerStats); mCameraPowerStatsCollector = new CameraPowerStatsCollector(mPowerStatsCollectorInjector); @@ -13413,6 +13417,13 @@ public class BatteryStatsImpl extends BatteryStats { private final BluetoothActivityInfoCache mLastBluetoothActivityInfo = new BluetoothActivityInfoCache(); + private void onBluetoothPowerStatsRetrieved(BluetoothActivityEnergyInfo info, + long elapsedRealtimeMs, long uptimeMs) { + // Do not populate consumed energy, because energy attribution is done by + // BluetoothPowerStatsProcessor. + updateBluetoothStateLocked(info, POWER_DATA_UNAVAILABLE, elapsedRealtimeMs, uptimeMs); + } + /** * Distribute Bluetooth energy info and network traffic to apps. * @@ -13421,10 +13432,6 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info, final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs) { - if (mBluetoothPowerStatsCollector.isEnabled()) { - return; - } - if (DEBUG_ENERGY) { Slog.d(TAG, "Updating bluetooth stats: " + info); } diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java index 63e8d9973237..8c588b4c9b98 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java @@ -195,23 +195,22 @@ public class BatteryUsageStatsProvider { mLastAccumulationMonotonicHistorySize = historySize; } - handler.post(() -> accumulateBatteryUsageStats(stats)); + // No need to store the accumulated stats asynchronously, as the entire accumulation + // operation is async + handler.post(() -> accumulateBatteryUsageStats(stats, false)); } /** * Computes BatteryUsageStats for the period since the last accumulated stats were stored, - * adds them to the accumulated stats and saves the result. + * adds them to the accumulated stats and asynchronously saves the result. */ public void accumulateBatteryUsageStats(BatteryStatsImpl stats) { - AccumulatedBatteryUsageStats accumulatedStats = loadAccumulatedBatteryUsageStats(); + accumulateBatteryUsageStats(stats, true); + } - final BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder() - .setMaxStatsAgeMs(0) - .includeProcessStateData() - .includePowerStateData() - .includeScreenStateData() - .build(); - updateAccumulatedBatteryUsageStats(accumulatedStats, stats, query); + private void accumulateBatteryUsageStats(BatteryStatsImpl stats, boolean storeAsync) { + AccumulatedBatteryUsageStats accumulatedStats = loadAccumulatedBatteryUsageStats(); + updateAccumulatedBatteryUsageStats(accumulatedStats, stats); PowerStatsSpan powerStatsSpan = new PowerStatsSpan(AccumulatedBatteryUsageStatsSection.ID); powerStatsSpan.addSection( @@ -220,8 +219,13 @@ public class BatteryUsageStatsProvider { accumulatedStats.startWallClockTime, accumulatedStats.endMonotonicTime - accumulatedStats.startMonotonicTime); mMonotonicClock.write(); - mPowerStatsStore.storePowerStatsSpanAsync(powerStatsSpan, - accumulatedStats.builder::discard); + if (storeAsync) { + mPowerStatsStore.storePowerStatsSpanAsync(powerStatsSpan, + accumulatedStats.builder::discard); + } else { + mPowerStatsStore.storePowerStatsSpan(powerStatsSpan); + accumulatedStats.builder.discard(); + } } /** @@ -269,7 +273,7 @@ public class BatteryUsageStatsProvider { BatteryUsageStats batteryUsageStats; if ((query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_ACCUMULATED) != 0) { - batteryUsageStats = getAccumulatedBatteryUsageStats(stats, query, currentTimeMs); + batteryUsageStats = getAccumulatedBatteryUsageStats(stats, query); } else if (query.getAggregatedToTimestamp() == 0) { BatteryUsageStats.Builder builder = computeBatteryUsageStats(stats, query, query.getMonotonicStartTime(), @@ -288,9 +292,13 @@ public class BatteryUsageStatsProvider { } private BatteryUsageStats getAccumulatedBatteryUsageStats(BatteryStatsImpl stats, - BatteryUsageStatsQuery query, long currentTimeMs) { + BatteryUsageStatsQuery query) { AccumulatedBatteryUsageStats accumulatedStats = loadAccumulatedBatteryUsageStats(); - updateAccumulatedBatteryUsageStats(accumulatedStats, stats, query); + if (accumulatedStats.endMonotonicTime == MonotonicClock.UNDEFINED + || mMonotonicClock.monotonicTime() - accumulatedStats.endMonotonicTime + > query.getMaxStatsAge()) { + updateAccumulatedBatteryUsageStats(accumulatedStats, stats); + } return accumulatedStats.builder.build(); } @@ -321,7 +329,7 @@ public class BatteryUsageStatsProvider { } private void updateAccumulatedBatteryUsageStats(AccumulatedBatteryUsageStats accumulatedStats, - BatteryStatsImpl stats, BatteryUsageStatsQuery query) { + BatteryStatsImpl stats) { long startMonotonicTime = accumulatedStats.endMonotonicTime; if (startMonotonicTime == MonotonicClock.UNDEFINED) { startMonotonicTime = stats.getMonotonicStartTime(); @@ -333,6 +341,7 @@ public class BatteryUsageStatsProvider { accumulatedStats.builder = new BatteryUsageStats.Builder( stats.getCustomEnergyConsumerNames(), true, true, true, 0); accumulatedStats.startWallClockTime = stats.getStartClockTime(); + accumulatedStats.startMonotonicTime = stats.getMonotonicStartTime(); accumulatedStats.builder.setStatsStartTimestamp(accumulatedStats.startWallClockTime); } @@ -342,7 +351,7 @@ public class BatteryUsageStatsProvider { accumulatedStats.builder.setStatsDuration(endWallClockTime - startMonotonicTime); mPowerAttributor.estimatePowerConsumption(accumulatedStats.builder, stats.getHistory(), - startMonotonicTime, MonotonicClock.UNDEFINED); + startMonotonicTime, endMonotonicTime); populateGeneralInfo(accumulatedStats.builder, stats); } diff --git a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java index d7aa9876fe0d..c12ae63140c9 100644 --- a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java @@ -15,6 +15,7 @@ */ package com.android.server.power.stats; +import android.annotation.Nullable; import android.bluetooth.BluetoothActivityEnergyInfo; import android.bluetooth.BluetoothAdapter; import android.bluetooth.UidTraffic; @@ -41,7 +42,10 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { private static final long BLUETOOTH_ACTIVITY_REQUEST_TIMEOUT = 20000; - private static final long ENERGY_UNSPECIFIED = -1; + interface Observer { + void onBluetoothPowerStatsRetrieved(@Nullable BluetoothActivityEnergyInfo info, + long elapsedRealtimeMs, long uptimeMs); + } public interface BluetoothStatsRetriever { interface Callback { @@ -65,6 +69,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { } private final Injector mInjector; + private final Observer mObserver; private com.android.server.power.stats.format.BluetoothPowerStatsLayout mLayout; private boolean mIsInitialized; @@ -89,13 +94,14 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { private final SparseArray<UidStats> mUidStats = new SparseArray<>(); - public BluetoothPowerStatsCollector(Injector injector) { + public BluetoothPowerStatsCollector(Injector injector, @Nullable Observer observer) { super(injector.getHandler(), injector.getPowerStatsCollectionThrottlePeriod( BatteryConsumer.powerComponentIdToString( BatteryConsumer.POWER_COMPONENT_BLUETOOTH)), injector.getUidResolver(), injector.getClock()); mInjector = injector; + mObserver = observer; } @Override @@ -146,15 +152,20 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { Arrays.fill(mDeviceStats, 0); mPowerStats.uidStats.clear(); - collectBluetoothActivityInfo(); + BluetoothActivityEnergyInfo activityInfo = collectBluetoothActivityInfo(); collectBluetoothScanStats(); mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout); + if (mObserver != null) { + mObserver.onBluetoothPowerStatsRetrieved(activityInfo, mClock.elapsedRealtime(), + mClock.uptimeMillis()); + } + return mPowerStats; } - private void collectBluetoothActivityInfo() { + private BluetoothActivityEnergyInfo collectBluetoothActivityInfo() { CompletableFuture<BluetoothActivityEnergyInfo> immediateFuture = new CompletableFuture<>(); boolean success = mBluetoothStatsRetriever.requestControllerActivityEnergyInfo( Runnable::run, @@ -173,7 +184,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { }); if (!success) { - return; + return null; } BluetoothActivityEnergyInfo activityInfo; @@ -186,7 +197,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { } if (activityInfo == null) { - return; + return null; } long rxTime = activityInfo.getControllerRxTimeMillis(); @@ -241,6 +252,8 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { mLayout.setUidTxBytes(stats, txDelta); } } + + return activityInfo; } private void collectBluetoothScanStats() { diff --git a/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java index c38904fe2873..90039e8e704e 100644 --- a/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java @@ -111,6 +111,22 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { return true; } + /** + * Must be called whenever the screen state (on/off/doze) changes. + */ + public void onScreenStateChange() { + if (ensureInitialized() && mConsumedEnergyHelper.getEnergyConsumerCount() != 0) { + // Sync power monitor reading immediately, because the estimation algorithm + // distributes consumed power proportionally between screen states. + // Since screen power consumption differs dramatically between different states, + // this would lead an overestimation in the screen-off state. + forceSchedule(); + return; + } + // Perhaps schedule a sync, allowing throttling + schedule(); + } + @Override public PowerStats collectStats() { if (!ensureInitialized()) { @@ -126,7 +142,7 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { long screenOnTimeMs = mScreenUsageTimeRetriever.getScreenOnTimeMs(display); if (!mFirstSample) { mLayout.setScreenOnDuration(mPowerStats.stats, display, - screenOnTimeMs - mLastScreenOnTime[display]); + Math.max(0, screenOnTimeMs - mLastScreenOnTime[display])); } mLastScreenOnTime[display] = screenOnTimeMs; @@ -135,14 +151,15 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { mScreenUsageTimeRetriever.getBrightnessLevelTimeMs(display, level); if (!mFirstSample) { mLayout.setBrightnessLevelDuration(mPowerStats.stats, display, level, - brightnessLevelTimeMs - mLastBrightnessLevelTime[display][level]); + Math.max(0, brightnessLevelTimeMs + - mLastBrightnessLevelTime[display][level])); } mLastBrightnessLevelTime[display][level] = brightnessLevelTimeMs; } long screenDozeTimeMs = mScreenUsageTimeRetriever.getScreenDozeTimeMs(display); if (!mFirstSample) { mLayout.setScreenDozeDuration(mPowerStats.stats, display, - screenDozeTimeMs - mLastDozeTime[display]); + Math.max(0, screenDozeTimeMs - mLastDozeTime[display])); } mLastDozeTime[display] = screenDozeTimeMs; } @@ -162,7 +179,7 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { } mLayout.setUidTopActivityDuration(uidStats, - mLayout.getUidTopActivityDuration(uidStats) + topActivityDuration); + Math.max(0, mLayout.getUidTopActivityDuration(uidStats) + topActivityDuration)); }); long elapsedRealtime = mClock.elapsedRealtime(); diff --git a/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java index dcdd3bd8b3fa..1b864bbe479c 100644 --- a/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java +++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java @@ -23,6 +23,7 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.BatteryStatsHistoryIterator; +import com.android.internal.os.MonotonicClock; import java.util.function.Consumer; @@ -169,10 +170,15 @@ public class PowerStatsAggregator { } } } - if (lastTime > baseTime) { - mStats.setDuration(lastTime - baseTime); - mStats.finish(lastTime); - consumer.accept(mStats); + if (startedSession) { + if (endTimeMs != MonotonicClock.UNDEFINED) { + lastTime = endTimeMs; + } + if (lastTime > baseTime) { + mStats.setDuration(lastTime - baseTime); + mStats.finish(lastTime); + consumer.accept(mStats); + } } mStats.reset(); // to free up memory diff --git a/services/core/java/com/android/server/security/advancedprotection/features/DisallowInstallUnknownSourcesAdvancedProtectionHook.java b/services/core/java/com/android/server/security/advancedprotection/features/DisallowInstallUnknownSourcesAdvancedProtectionHook.java index bb523d63c43a..59bb34d1bedd 100644 --- a/services/core/java/com/android/server/security/advancedprotection/features/DisallowInstallUnknownSourcesAdvancedProtectionHook.java +++ b/services/core/java/com/android/server/security/advancedprotection/features/DisallowInstallUnknownSourcesAdvancedProtectionHook.java @@ -19,24 +19,13 @@ package com.android.server.security.advancedprotection.features; import static android.security.advancedprotection.AdvancedProtectionManager.ADVANCED_PROTECTION_SYSTEM_ENTITY; import static android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES; -import android.Manifest; import android.annotation.NonNull; -import android.app.ActivityManagerInternal; -import android.app.AppGlobals; -import android.app.AppOpsManager; import android.app.admin.DevicePolicyManager; import android.content.Context; -import android.content.pm.IPackageManager; -import android.content.pm.PackageManager; -import android.content.pm.UserInfo; -import android.os.Process; -import android.os.RemoteException; import android.os.UserManager; import android.security.advancedprotection.AdvancedProtectionFeature; import android.util.Slog; -import com.android.server.LocalServices; - /** @hide */ public final class DisallowInstallUnknownSourcesAdvancedProtectionHook extends AdvancedProtectionHook { @@ -45,24 +34,14 @@ public final class DisallowInstallUnknownSourcesAdvancedProtectionHook private final AdvancedProtectionFeature mFeature = new AdvancedProtectionFeature( FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES); - private final ActivityManagerInternal mActivityManagerInternal; - private final AppOpsManager mAppOpsManager; private final DevicePolicyManager mDevicePolicyManager; - private final IPackageManager mIPackageManager; - private final PackageManager mPackageManager; - private final UserManager mUserManager; public DisallowInstallUnknownSourcesAdvancedProtectionHook(@NonNull Context context, boolean enabled) { super(context, enabled); - mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); - mAppOpsManager = context.getSystemService(AppOpsManager.class); mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); - mIPackageManager = AppGlobals.getPackageManager(); - mUserManager = context.getSystemService(UserManager.class); - mPackageManager = context.getPackageManager(); - setRestriction(enabled); + onAdvancedProtectionChanged(enabled); } @NonNull @@ -76,7 +55,8 @@ public final class DisallowInstallUnknownSourcesAdvancedProtectionHook return true; } - private void setRestriction(boolean enabled) { + @Override + public void onAdvancedProtectionChanged(boolean enabled) { if (enabled) { Slog.d(TAG, "Setting DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY restriction"); mDevicePolicyManager.addUserRestrictionGlobally(ADVANCED_PROTECTION_SYSTEM_ENTITY, @@ -87,36 +67,4 @@ public final class DisallowInstallUnknownSourcesAdvancedProtectionHook UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY); } } - - @Override - public void onAdvancedProtectionChanged(boolean enabled) { - setRestriction(enabled); - if (enabled) return; - - // Leave OP_REQUEST_INSTALL_PACKAGES disabled when APM is disabled. - Slog.d(TAG, "Setting all OP_REQUEST_INSTALL_PACKAGES to MODE_ERRORED"); - for (UserInfo userInfo : mUserManager.getAliveUsers()) { - try { - final String[] packagesWithRequestInstallPermission = mIPackageManager - .getAppOpPermissionPackages( - Manifest.permission.REQUEST_INSTALL_PACKAGES, userInfo.id); - for (String packageName : packagesWithRequestInstallPermission) { - try { - int uid = mPackageManager.getPackageUidAsUser(packageName, userInfo.id); - boolean isCallerInstrumented = mActivityManagerInternal - .getInstrumentationSourceUid(uid) != Process.INVALID_UID; - if (!isCallerInstrumented) { - mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES, uid, - packageName, AppOpsManager.MODE_ERRORED); - } - } catch (PackageManager.NameNotFoundException e) { - Slog.e(TAG, "Couldn't retrieve uid for a package: " + e); - } - } - } catch (RemoteException e) { - Slog.e(TAG, "Couldn't retrieve packages with REQUEST_INSTALL_PACKAGES." - + " getAppOpPermissionPackages() threw the following exception: " + e); - } - } - } } diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index 3f814f9db1c8..417d6a5d12ee 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -110,6 +110,7 @@ import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.apphibernation.AppHibernationManagerInternal; import com.android.server.apphibernation.AppHibernationService; +import com.android.window.flags.Flags; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @@ -778,11 +779,12 @@ class ActivityMetricsLogger { */ private void updateSplitPairLaunches(@NonNull TransitionInfo info) { final Task launchedActivityTask = info.mLastLaunchedActivity.getTask(); - final Task adjacentToLaunchedTask = launchedActivityTask.getAdjacentTask(); - if (adjacentToLaunchedTask == null) { + final Task launchedSplitRootTask = launchedActivityTask.getTaskWithAdjacent(); + if (launchedSplitRootTask == null) { // Not a part of a split pair return; } + for (int i = mTransitionInfoList.size() - 1; i >= 0; i--) { final TransitionInfo otherInfo = mTransitionInfoList.get(i); if (otherInfo == info) { @@ -790,7 +792,15 @@ class ActivityMetricsLogger { } final Task otherTask = otherInfo.mLastLaunchedActivity.getTask(); // The adjacent task is the split root in which activities are started - if (otherTask.isDescendantOf(adjacentToLaunchedTask)) { + final boolean isDescendantOfAdjacent; + if (Flags.allowMultipleAdjacentTaskFragments()) { + isDescendantOfAdjacent = launchedSplitRootTask.forOtherAdjacentTasks( + otherTask::isDescendantOf); + } else { + isDescendantOfAdjacent = otherTask.isDescendantOf( + launchedSplitRootTask.getAdjacentTask()); + } + if (isDescendantOfAdjacent) { if (DEBUG_METRICS) { Slog.i(TAG, "Found adjacent tasks t1=" + launchedActivityTask.mTaskId + " t2=" + otherTask.mTaskId); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 3467f947ece4..29a71328127b 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -248,7 +248,6 @@ import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; import static com.android.server.wm.WindowManagerService.sEnableShellTransitions; import static com.android.server.wm.WindowState.LEGACY_POLICY_VISIBILITY; -import static com.android.server.wm.WindowStateAnimator.HAS_DRAWN; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.END_TAG; @@ -2406,9 +2405,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return false; } - final TaskSnapshot snapshot = - mWmService.mTaskSnapshotController.getSnapshot(task.mTaskId, task.mUserId, - false /* restoreFromDisk */, false /* isLowResolution */); + final TaskSnapshot snapshot = mWmService.mTaskSnapshotController.getSnapshot(task.mTaskId, + false /* isLowResolution */); final int type = getStartingWindowType(newTask, taskSwitch, processRunning, allowTaskSnapshot, activityCreated, activityAllDrawn, snapshot); @@ -2650,7 +2648,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Skip copy splash screen to client if it was resized, or the starting data already // requested to be removed after transaction commit. || (mStartingData != null && (mStartingData.mResizedFromTransfer - || mStartingData.mRemoveAfterTransaction != AFTER_TRANSACTION_IDLE)) + || mStartingData.mRemoveAfterTransaction + == AFTER_TRANSACTION_REMOVE_DIRECTLY)) || isRelaunching()) { return false; } @@ -3212,8 +3211,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * will be ignored. */ boolean isUniversalResizeable() { - final boolean isLargeScreen = mDisplayContent != null && mDisplayContent.getConfiguration() - .smallestScreenWidthDp >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP + final boolean isLargeScreen = mDisplayContent != null && mDisplayContent.isLargeScreen() && mDisplayContent.getIgnoreOrientationRequest(); if (!canBeUniversalResizeable(info.applicationInfo, mWmService, isLargeScreen, true /* forActivity */)) { @@ -4585,6 +4583,19 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } + /** + * Returns {@code true} if the requested orientation of this activity is the same as the + * resolved orientation of the from activity. + */ + private boolean isStartingOrientationCompatible(@NonNull ActivityRecord fromActivity) { + final int fromOrientation = fromActivity.getConfiguration().orientation; + final int requestedOrientation = getRequestedConfigurationOrientation(); + if (requestedOrientation == ORIENTATION_UNDEFINED) { + return fromOrientation == getConfiguration().orientation; + } + return fromOrientation == requestedOrientation; + } + private boolean transferStartingWindow(@NonNull ActivityRecord fromActivity) { final WindowState tStartingWindow = fromActivity.mStartingWindow; if (tStartingWindow != null && fromActivity.mStartingSurface != null) { @@ -4604,13 +4615,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } // Do not transfer if the orientation doesn't match, redraw starting window while it is // on top will cause flicker. - final int fromOrientation = fromActivity.getConfiguration().orientation; - final int requestedOrientation = getRequestedConfigurationOrientation(); - if (requestedOrientation == ORIENTATION_UNDEFINED) { - if (fromOrientation != getConfiguration().orientation) { - return false; - } - } else if (fromOrientation != requestedOrientation) { + if (!isStartingOrientationCompatible(fromActivity)) { return false; } @@ -4708,6 +4713,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } return true; } else if (fromActivity.mStartingData != null) { + if (fromActivity.mStartingData instanceof SnapshotStartingData + && !isStartingOrientationCompatible(fromActivity)) { + // Do not transfer because the snapshot will be distorted in different orientation. + return false; + } // The previous app was getting ready to show a // starting window, but hasn't yet done so. Steal it! ProtoLog.v(WM_DEBUG_STARTING_WINDOW, @@ -5408,10 +5418,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } void setDeferHidingClient() { + if (Flags.removeDeferHidingClient()) { + return; + } mDeferHidingClient = true; } void clearDeferHidingClient() { + if (Flags.removeDeferHidingClient()) { + return; + } if (!mDeferHidingClient) return; mDeferHidingClient = false; if (!mVisibleRequested) { @@ -5590,18 +5606,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // stopped, then we need to set up to wait for its windows to be ready. if (!isVisible() || mAppStopped) { clearAllDrawn(); - // Reset the draw state in order to prevent the starting window to be immediately - // dismissed when the app still has the surface. - if (!Flags.resetDrawStateOnClientInvisible() - && !isVisible() && !isClientVisible()) { - forAllWindows(w -> { - if (w.mWinAnimator.mDrawState == HAS_DRAWN) { - w.mWinAnimator.resetDrawState(); - // Force add to mResizingWindows, so the window will report drawn. - w.forceReportingResized(); - } - }, true /* traverseTopToBottom */); - } } // In the case where we are making an app visible but holding off for a transition, @@ -7141,9 +7145,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override void setClientVisible(boolean clientVisible) { - // TODO(shell-transitions): Remove mDeferHidingClient once everything is shell-transitions. - // pip activities should just remain in clientVisible. - if (!clientVisible && mDeferHidingClient) return; + if (!Flags.removeDeferHidingClient()) { + // TODO(shell-transitions): Remove mDeferHidingClient once everything is + // shell-transitions. pip activities should just remain in clientVisible. + if (!clientVisible && mDeferHidingClient) return; + } super.setClientVisible(clientVisible); } diff --git a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java index 1208b6ef396f..08ceb61e14a8 100644 --- a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java +++ b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java @@ -142,6 +142,8 @@ public class ActivityServiceConnectionsHolder<T> { /** Used by {@link ActivityRecord#dump}. */ @Override public String toString() { - return String.valueOf(mConnections); + synchronized (mActivity) { + return String.valueOf(mConnections); + } } } diff --git a/services/core/java/com/android/server/wm/ActivitySnapshotController.java b/services/core/java/com/android/server/wm/ActivitySnapshotController.java index 57a0bb53c9dc..9aaa0e1cfd6b 100644 --- a/services/core/java/com/android/server/wm/ActivitySnapshotController.java +++ b/services/core/java/com/android/server/wm/ActivitySnapshotController.java @@ -149,7 +149,8 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord for (int i = activities.length - 1; i >= 0; --i) { fileId ^= getSystemHashCode(activities[i]); } - return tmpUsf.mFileId == fileId ? mCache.getSnapshot(tmpUsf.mActivityIds.get(0)) : null; + return tmpUsf.mFileId == fileId + ? mCache.getSnapshotInner(tmpUsf.mActivityIds.get(0)) : null; } private void cleanUpUserFiles(int userId) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index afa7ea136c77..5eee8ece6a67 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3996,15 +3996,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } // Try to load snapshot from cache first, and add reference if the snapshot is in cache. final TaskSnapshot snapshot = mWindowManager.mTaskSnapshotController.getSnapshot(taskId, - task.mUserId, false /* restoreFromDisk */, isLowResolution); + isLowResolution, usage); if (snapshot != null) { - snapshot.addReference(usage); return snapshot; } } // Don't call this while holding the lock as this operation might hit the disk. - return mWindowManager.mTaskSnapshotController.getSnapshot(taskId, - task.mUserId, true /* restoreFromDisk */, isLowResolution); + return mWindowManager.mTaskSnapshotController.getSnapshotFromDisk(taskId, + task.mUserId, isLowResolution, usage); } @Override @@ -4020,10 +4019,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found"); return null; } + final TaskSnapshot snapshot = mWindowManager.mTaskSnapshotController.getSnapshot( + taskId, isLowResolution, TaskSnapshot.REFERENCE_WRITE_TO_PARCEL); + if (snapshot != null) { + return snapshot; + } } // Don't call this while holding the lock as this operation might hit the disk. - return mWindowManager.mTaskSnapshotController.getSnapshot(taskId, - task.mUserId, true /* restoreFromDisk */, isLowResolution); + return mWindowManager.mTaskSnapshotController.getSnapshotFromDisk(taskId, + task.mUserId, isLowResolution, TaskSnapshot.REFERENCE_WRITE_TO_PARCEL); } finally { Binder.restoreCallingIdentity(ident); } diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 741eefae4462..492d84f4a12f 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -996,8 +996,7 @@ public class AppTransitionController { // If the current window container is a task with adjacent task set, the both // adjacent tasks will be opened or closed together. To get their opening or // closing animation target independently, skip promoting their animation targets. - if (current.asTask() != null - && current.asTask().getAdjacentTask() != null) { + if (current.asTask() != null && current.asTask().hasAdjacentTask()) { canPromote = false; } diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 3968b525f11d..e9e3c9ee389e 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -2251,8 +2251,7 @@ class BackNavigationController { if (w.asTask() != null) { final Task task = w.asTask(); snapshot = task.mRootWindowContainer.mWindowManager.mTaskSnapshotController.getSnapshot( - task.mTaskId, task.mUserId, false /* restoreFromDisk */, - false /* isLowResolution */); + task.mTaskId, false /* isLowResolution */); } else { ActivityRecord ar = w.asActivityRecord(); if (ar == null && w.asTaskFragment() != null) { diff --git a/services/core/java/com/android/server/wm/ContentRecorder.java b/services/core/java/com/android/server/wm/ContentRecorder.java index 6ccceb9cf564..8eccffd8fe3b 100644 --- a/services/core/java/com/android/server/wm/ContentRecorder.java +++ b/services/core/java/com/android/server/wm/ContentRecorder.java @@ -473,15 +473,17 @@ final class ContentRecorder implements WindowContainerListener { case RECORD_CONTENT_TASK: // Given the WindowToken of the region to record, retrieve the associated // SurfaceControl. - if (tokenToRecord == null) { + final WindowContainer wc = tokenToRecord != null + ? WindowContainer.fromBinder(tokenToRecord) : null; + if (wc == null) { handleStartRecordingFailed(); ProtoLog.v(WM_DEBUG_CONTENT_RECORDING, - "Content Recording: Unable to start recording due to null token for " - + "display %d", + "Content Recording: Unable to start recording due to null token or " + + "null window container for " + "display %d", mDisplayContent.getDisplayId()); return null; } - Task taskToRecord = WindowContainer.fromBinder(tokenToRecord).asTask(); + final Task taskToRecord = wc.asTask(); if (taskToRecord == null) { handleStartRecordingFailed(); ProtoLog.v(WM_DEBUG_CONTENT_RECORDING, diff --git a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java index 37e8f6260420..b076aebe5210 100644 --- a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java +++ b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java @@ -193,7 +193,7 @@ class DeferredDisplayUpdater { final Rect startBounds = new Rect(0, 0, mDisplayContent.mInitialDisplayWidth, mDisplayContent.mInitialDisplayHeight); final int fromRotation = mDisplayContent.getRotation(); - if (Flags.blastSyncNotificationShadeOnDisplaySwitch() && physicalDisplayUpdated) { + if (physicalDisplayUpdated) { final WindowState notificationShade = mDisplayContent.getDisplayPolicy().getNotificationShade(); if (notificationShade != null && notificationShade.isVisible() diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c2141a7103be..f8086615b7d1 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -439,6 +439,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp */ private boolean mSandboxDisplayApis = true; + /** Whether {@link #setIgnoreOrientationRequest} is called to override the default policy. */ + @VisibleForTesting + boolean mHasSetIgnoreOrientationRequest; + /** * Overridden display density for current user. Initialized with {@link #mInitialDisplayDensity} * but can be set from Settings or via shell command "adb shell wm density". @@ -6722,8 +6726,25 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mDisplayPolicy.getSystemUiContext(); } + /** Returns {@code} true if the smallest screen width dp >= 600. */ + boolean isLargeScreen() { + return getConfiguration().smallestScreenWidthDp + >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP; + } + + @Override + boolean getIgnoreOrientationRequest() { + if (mHasSetIgnoreOrientationRequest + || !com.android.window.flags.Flags.universalResizableByDefault()) { + return super.getIgnoreOrientationRequest(); + } + // Large screen (sw >= 600dp) ignores orientation request by default. + return isLargeScreen() && !mWmService.isIgnoreOrientationRequestDisabled(); + } + @Override boolean setIgnoreOrientationRequest(boolean ignoreOrientationRequest) { + mHasSetIgnoreOrientationRequest = true; if (mSetIgnoreOrientationRequest == ignoreOrientationRequest) return false; final boolean rotationChanged = super.setIgnoreOrientationRequest(ignoreOrientationRequest); mWmService.mDisplayWindowSettings.setIgnoreOrientationRequest( diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 659bb6784c89..01e00e9d67f7 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2485,7 +2485,7 @@ public class DisplayPolicy { final TaskDisplayArea defaultTaskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea(); final boolean adjacentTasksVisible = defaultTaskDisplayArea.getRootTask(task -> task.isVisible() - && task.getTopLeafTask().getAdjacentTask() != null) + && task.getTopLeafTask().hasAdjacentTask()) != null; final Task topFreeformTask = defaultTaskDisplayArea .getTopRootTaskInWindowingMode(WINDOWING_MODE_FREEFORM); diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index f6d05d08cb04..f0ba822c37c5 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -374,9 +374,9 @@ class DisplayWindowSettings { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); - final boolean ignoreOrientationRequest = settings.mIgnoreOrientationRequest != null - ? settings.mIgnoreOrientationRequest : false; - dc.setIgnoreOrientationRequest(ignoreOrientationRequest); + if (settings.mIgnoreOrientationRequest != null) { + dc.setIgnoreOrientationRequest(settings.mIgnoreOrientationRequest); + } dc.getDisplayRotation().resetAllowAllRotations(); } diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index 4230cd868c03..cba606cf2b0c 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -324,7 +324,8 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider { if (target != imeControlTarget) { // TODO(b/353463205): check if fromUser=false is correct here boolean imeVisible = target.isRequestedVisible(WindowInsets.Type.ime()); - ImeTracker.Token statsToken = ImeTracker.forLogging().onStart(ImeTracker.TYPE_HIDE, + ImeTracker.Token statsToken = ImeTracker.forLogging().onStart( + imeVisible ? ImeTracker.TYPE_SHOW : ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_SERVER, imeVisible ? SoftInputShowHideReason.SHOW_INPUT_TARGET_CHANGED : SoftInputShowHideReason.HIDE_INPUT_TARGET_CHANGED, diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java index 9d21183c6c03..7751ac3f9fc6 100644 --- a/services/core/java/com/android/server/wm/InputManagerCallback.java +++ b/services/core/java/com/android/server/wm/InputManagerCallback.java @@ -128,8 +128,7 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal @Override public void notifyConfigurationChanged() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "notifyConfigurationChanged"); - final boolean changed = !com.android.window.flags.Flags.filterIrrelevantInputDeviceChange() - || updateLastInputConfigurationSources(); + final boolean changed = updateLastInputConfigurationSources(); // Even if the input devices are not changed, there could be other pending changes // during booting. It's fine to apply earlier. diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 46312aff1fb6..3d2868540334 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -156,6 +156,7 @@ import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.WindowManagerPolicy; import com.android.server.utils.Slogf; import com.android.server.wm.utils.RegionUtils; +import com.android.window.flags.Flags; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -262,6 +263,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> int mCurrentUser; /** Root task id of the front root task when user switched, indexed by userId. */ SparseIntArray mUserRootTaskInFront = new SparseIntArray(2); + SparseArray<IntArray> mUserVisibleRootTasks = new SparseArray<>(); /** * A list of tokens that cause the top activity to be put to sleep. @@ -1794,12 +1796,24 @@ class RootWindowContainer extends WindowContainer<DisplayContent> activityAssistInfos.clear(); activityAssistInfos.add(new ActivityAssistInfo(top)); // Check if the activity on the split screen. - final Task adjacentTask = top.getTask().getAdjacentTask(); - if (adjacentTask != null) { - final ActivityRecord adjacentActivityRecord = - adjacentTask.getTopNonFinishingActivity(); - if (adjacentActivityRecord != null) { - activityAssistInfos.add(new ActivityAssistInfo(adjacentActivityRecord)); + if (Flags.allowMultipleAdjacentTaskFragments()) { + top.getTask().forOtherAdjacentTasks(task -> { + final ActivityRecord adjacentActivityRecord = + task.getTopNonFinishingActivity(); + if (adjacentActivityRecord != null) { + activityAssistInfos.add( + new ActivityAssistInfo(adjacentActivityRecord)); + } + }); + } else { + final Task adjacentTask = top.getTask().getAdjacentTask(); + if (adjacentTask != null) { + final ActivityRecord adjacentActivityRecord = + adjacentTask.getTopNonFinishingActivity(); + if (adjacentActivityRecord != null) { + activityAssistInfos.add( + new ActivityAssistInfo(adjacentActivityRecord)); + } } } if (rootTask == topFocusedRootTask) { @@ -1924,7 +1938,18 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // appropriate. removeRootTasksInWindowingModes(WINDOWING_MODE_PINNED); - mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId); + if (Flags.enableTopVisibleRootTaskPerUserTracking()) { + final IntArray visibleRootTasks = new IntArray(); + forAllRootTasks(rootTask -> { + if (mCurrentUser == rootTask.mUserId && rootTask.isVisibleRequested()) { + visibleRootTasks.add(rootTask.getRootTaskId()); + } + }, /* traverseTopToBottom */ false); + mUserVisibleRootTasks.put(mCurrentUser, visibleRootTasks); + } else { + mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId); + } + mCurrentUser = userId; mTaskSupervisor.mStartingUsers.add(uss); @@ -1937,22 +1962,60 @@ class RootWindowContainer extends WindowContainer<DisplayContent> Slog.i(TAG, "Persisting top task because it belongs to an always-visible user"); // For a normal user-switch, we will restore the new user's task. But if the pre-switch // top task is an always-visible (Communal) one, keep it even after the switch. - mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId); + if (Flags.enableTopVisibleRootTaskPerUserTracking()) { + final IntArray rootTasks = mUserVisibleRootTasks.get(mCurrentUser); + rootTasks.add(focusRootTaskId); + mUserVisibleRootTasks.put(mCurrentUser, rootTasks); + } else { + mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId); + } + } final int restoreRootTaskId = mUserRootTaskInFront.get(userId); + final IntArray rootTaskIdsToRestore = mUserVisibleRootTasks.get(userId); + boolean homeInFront = false; + if (Flags.enableTopVisibleRootTaskPerUserTracking()) { + if (rootTaskIdsToRestore == null) { + // If there are no root tasks saved, try restore id 0 which should create and launch + // the home task. + handleRootTaskLaunchOnUserSwitch(/* restoreRootTaskId */INVALID_TASK_ID); + homeInFront = true; + } else { + for (int i = 0; i < rootTaskIdsToRestore.size(); i++) { + handleRootTaskLaunchOnUserSwitch(rootTaskIdsToRestore.get(i)); + } + // Check if the top task is type home + if (rootTaskIdsToRestore.size() > 0) { + final int topRootTaskId = rootTaskIdsToRestore.get( + rootTaskIdsToRestore.size() - 1); + homeInFront = isHomeTask(topRootTaskId); + } + } + } else { + handleRootTaskLaunchOnUserSwitch(restoreRootTaskId); + // Check if the top task is type home + homeInFront = isHomeTask(restoreRootTaskId); + } + return homeInFront; + } + + private boolean isHomeTask(int taskId) { + final Task rootTask = getRootTask(taskId); + return rootTask != null && rootTask.isActivityTypeHome(); + } + + private void handleRootTaskLaunchOnUserSwitch(int restoreRootTaskId) { Task rootTask = getRootTask(restoreRootTaskId); if (rootTask == null) { rootTask = getDefaultTaskDisplayArea().getOrCreateRootHomeTask(); } - final boolean homeInFront = rootTask.isActivityTypeHome(); if (rootTask.isOnHomeDisplay()) { rootTask.moveToFront("switchUserOnHomeDisplay"); } else { // Root task was moved to another display while user was swapped out. resumeHomeActivity(null, "switchUserOnOtherDisplay", getDefaultTaskDisplayArea()); } - return homeInFront; } /** Returns whether the given user is to be always-visible (e.g. a communal profile). */ @@ -1963,7 +2026,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } void removeUser(int userId) { - mUserRootTaskInFront.delete(userId); + if (Flags.enableTopVisibleRootTaskPerUserTracking()) { + mUserVisibleRootTasks.delete(userId); + } else { + mUserRootTaskInFront.delete(userId); + } } /** @@ -1976,7 +2043,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> rootTask = getDefaultTaskDisplayArea().getOrCreateRootHomeTask(); } - mUserRootTaskInFront.put(userId, rootTask.getRootTaskId()); + if (Flags.enableTopVisibleRootTaskPerUserTracking()) { + final IntArray rootTasks = mUserVisibleRootTasks.get(userId, new IntArray()); + rootTasks.add(rootTask.getRootTaskId()); + mUserVisibleRootTasks.put(userId, rootTasks); + } else { + mUserRootTaskInFront.put(userId, rootTask.getRootTaskId()); + } } } @@ -2124,7 +2197,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (!tf.isOrganizedTaskFragment()) { return; } - tf.resetAdjacentTaskFragment(); + tf.clearAdjacentTaskFragments(); tf.setCompanionTaskFragment(null /* companionTaskFragment */); tf.setAnimationParams(TaskFragmentAnimationParams.DEFAULT); if (tf.getTopNonFinishingActivity() != null) { diff --git a/services/core/java/com/android/server/wm/SnapshotCache.java b/services/core/java/com/android/server/wm/SnapshotCache.java index 1e6ee7dc318f..9812a88bfa5a 100644 --- a/services/core/java/com/android/server/wm/SnapshotCache.java +++ b/services/core/java/com/android/server/wm/SnapshotCache.java @@ -51,7 +51,7 @@ abstract class SnapshotCache<TYPE extends WindowContainer> { } @Nullable - final TaskSnapshot getSnapshot(Integer id) { + final TaskSnapshot getSnapshotInner(Integer id) { synchronized (mLock) { // Try the running cache. final CacheEntry entry = mRunningCache.get(id); diff --git a/services/core/java/com/android/server/wm/SnapshotController.java b/services/core/java/com/android/server/wm/SnapshotController.java index 3ee2e6048634..dcdffa416e33 100644 --- a/services/core/java/com/android/server/wm/SnapshotController.java +++ b/services/core/java/com/android/server/wm/SnapshotController.java @@ -202,7 +202,7 @@ class SnapshotController { final Task task = wc.asTask(); if (task != null && wc.isVisibleRequested() && !task.inPinnedWindowingMode()) { final TaskSnapshot snapshot = mTaskSnapshotController.getSnapshot(task.mTaskId, - task.mUserId, false /* restoreFromDisk */, false /* isLowResolution */); + false /* isLowResolution */); if (snapshot != null) { mTaskSnapshotController.removeAndDeleteSnapshot(task.mTaskId, task.mUserId); } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index c8befb21fe13..76d8861022bb 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -2500,20 +2500,79 @@ class Task extends TaskFragment { return parentTask == null ? null : parentTask.getCreatedByOrganizerTask(); } - /** @return the first adjacent task of this task or its parent. */ + /** @deprecated b/373709676 replace with {@link #forOtherAdjacentTasks(Consumer)} ()}. */ + @Deprecated @Nullable Task getAdjacentTask() { - final TaskFragment adjacentTaskFragment = getAdjacentTaskFragment(); - if (adjacentTaskFragment != null && adjacentTaskFragment.asTask() != null) { - return adjacentTaskFragment.asTask(); + if (Flags.allowMultipleAdjacentTaskFragments()) { + throw new IllegalStateException("allowMultipleAdjacentTaskFragments is enabled. " + + "Use #forOtherAdjacentTasks instead"); + } + final Task taskWithAdjacent = getTaskWithAdjacent(); + if (taskWithAdjacent == null) { + return null; } + return taskWithAdjacent.getAdjacentTaskFragment().asTask(); + } + /** Finds the first Task parent (or itself) that has adjacent. */ + @Nullable + Task getTaskWithAdjacent() { + if (hasAdjacentTaskFragment()) { + return this; + } final WindowContainer parent = getParent(); if (parent == null || parent.asTask() == null) { return null; } + return parent.asTask().getTaskWithAdjacent(); + } + + /** Returns true if this or its parent has adjacent Task. */ + boolean hasAdjacentTask() { + return getTaskWithAdjacent() != null; + } - return parent.asTask().getAdjacentTask(); + /** + * Finds the first Task parent (or itself) that has adjacent. Runs callback on all the adjacent + * Tasks. The invoke order is not guaranteed. + */ + void forOtherAdjacentTasks(@NonNull Consumer<Task> callback) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + throw new IllegalStateException("allowMultipleAdjacentTaskFragments is not enabled. " + + "Use #getAdjacentTask instead"); + } + + final Task taskWithAdjacent = getTaskWithAdjacent(); + if (taskWithAdjacent == null) { + return; + } + final AdjacentSet adjacentTasks = taskWithAdjacent.getAdjacentTaskFragments(); + adjacentTasks.forAllTaskFragments(tf -> { + // We don't support Task adjacent to non-Task TaskFragment. + callback.accept(tf.asTask()); + }, taskWithAdjacent /* exclude */); + } + + /** + * Finds the first Task parent (or itself) that has adjacent. Runs callback on all the adjacent + * Tasks. Returns early if callback returns true on any of them. The invoke order is not + * guaranteed. + */ + boolean forOtherAdjacentTasks(@NonNull Predicate<Task> callback) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + throw new IllegalStateException("allowMultipleAdjacentTaskFragments is not enabled. " + + "Use getAdjacentTask instead"); + } + final Task taskWithAdjacent = getTaskWithAdjacent(); + if (taskWithAdjacent == null) { + return false; + } + final AdjacentSet adjacentTasks = taskWithAdjacent.getAdjacentTaskFragments(); + return adjacentTasks.forAllTaskFragments(tf -> { + // We don't support Task adjacent to non-Task TaskFragment. + return callback.test(tf.asTask()); + }, taskWithAdjacent /* exclude */); } // TODO(task-merge): Figure out what's the right thing to do for places that used it. @@ -2907,7 +2966,7 @@ class Task extends TaskFragment { Rect outSurfaceInsets) { // If this task has its adjacent task, it means they should animate together. Use display // bounds for them could move same as full screen task. - if (getAdjacentTask() != null) { + if (hasAdjacentTask()) { super.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets); return; } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index c1a33c468cee..9564c5959d98 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -61,6 +61,7 @@ import com.android.internal.util.function.pooled.PooledLambda; import com.android.internal.util.function.pooled.PooledPredicate; import com.android.server.pm.UserManagerInternal; import com.android.server.wm.LaunchParamsController.LaunchParams; +import com.android.window.flags.Flags; import java.io.PrintWriter; import java.util.ArrayList; @@ -1088,8 +1089,19 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { // Use launch-adjacent-flag-root if launching with launch-adjacent flag. if ((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0 && mLaunchAdjacentFlagRootTask != null) { - final Task launchAdjacentRootAdjacentTask = - mLaunchAdjacentFlagRootTask.getAdjacentTask(); + final Task launchAdjacentRootAdjacentTask; + if (Flags.allowMultipleAdjacentTaskFragments()) { + final Task[] tmpTask = new Task[1]; + mLaunchAdjacentFlagRootTask.forOtherAdjacentTasks(task -> { + // TODO(b/382208145): enable FLAG_ACTIVITY_LAUNCH_ADJACENT for 3+. + // Find the first adjacent for now. + tmpTask[0] = task; + return true; + }); + launchAdjacentRootAdjacentTask = tmpTask[0]; + } else { + launchAdjacentRootAdjacentTask = mLaunchAdjacentFlagRootTask.getAdjacentTask(); + } if (sourceTask != null && (sourceTask == candidateTask || sourceTask.topRunningActivity() == null)) { // Do nothing when task that is getting opened is same as the source or when @@ -1114,15 +1126,26 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) { if (mLaunchRootTasks.get(i).contains(windowingMode, activityType)) { final Task launchRootTask = mLaunchRootTasks.get(i).task; - final Task adjacentRootTask = launchRootTask != null - ? launchRootTask.getAdjacentTask() : null; - if (sourceTask != null && adjacentRootTask != null - && (sourceTask == adjacentRootTask - || sourceTask.isDescendantOf(adjacentRootTask))) { - return adjacentRootTask; - } else { + if (launchRootTask == null || sourceTask == null) { + return launchRootTask; + } + if (!Flags.allowMultipleAdjacentTaskFragments()) { + final Task adjacentRootTask = launchRootTask.getAdjacentTask(); + if (adjacentRootTask != null && (sourceTask == adjacentRootTask + || sourceTask.isDescendantOf(adjacentRootTask))) { + return adjacentRootTask; + } return launchRootTask; } + final Task[] adjacentRootTask = new Task[1]; + launchRootTask.forOtherAdjacentTasks(task -> { + if (sourceTask == task || sourceTask.isDescendantOf(task)) { + adjacentRootTask[0] = task; + return true; + } + return false; + }); + return adjacentRootTask[0] != null ? adjacentRootTask[0] : launchRootTask; } } @@ -1133,12 +1156,31 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { // A pinned task relaunching should be handled by its task organizer. Skip fallback // launch target of a pinned task from source task. || candidateTask.getWindowingMode() != WINDOWING_MODE_PINNED)) { - final Task adjacentTarget = sourceTask.getAdjacentTask(); - if (adjacentTarget != null) { - if (candidateTask != null - && (candidateTask == adjacentTarget - || candidateTask.isDescendantOf(adjacentTarget))) { - return adjacentTarget; + final Task taskWithAdjacent = sourceTask.getTaskWithAdjacent(); + if (taskWithAdjacent != null) { + // Has adjacent. + if (candidateTask == null) { + return sourceTask.getCreatedByOrganizerTask(); + } + // Check if the candidate is already positioned in the adjacent Task. + if (Flags.allowMultipleAdjacentTaskFragments()) { + final Task[] adjacentRootTask = new Task[1]; + sourceTask.forOtherAdjacentTasks(task -> { + if (candidateTask == task || candidateTask.isDescendantOf(task)) { + adjacentRootTask[0] = task; + return true; + } + return false; + }); + if (adjacentRootTask[0] != null) { + return adjacentRootTask[0]; + } + } else { + final Task adjacentTarget = taskWithAdjacent.getAdjacentTask(); + if (candidateTask == adjacentTarget + || candidateTask.isDescendantOf(adjacentTarget)) { + return adjacentTarget; + } } return sourceTask.getCreatedByOrganizerTask(); } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 51b8bd1f0091..cb6b69072e14 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -94,6 +94,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.os.IBinder; import android.os.UserHandle; +import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.Slog; import android.util.proto.ProtoOutputStream; @@ -239,12 +240,20 @@ class TaskFragment extends WindowContainer<WindowContainer> { /** This task fragment will be removed when the cleanup of its children are done. */ private boolean mIsRemovalRequested; - /** The TaskFragment that is adjacent to this one. */ + /** @deprecated b/373709676 replace with {@link #mAdjacentTaskFragments} */ + @Deprecated @Nullable private TaskFragment mAdjacentTaskFragment; /** - * Unlike the {@link mAdjacentTaskFragment}, the companion TaskFragment is not always visually + * The TaskFragments that are adjacent to each other, including this TaskFragment. + * All TaskFragments in this set share the same set instance. + */ + @Nullable + private AdjacentSet mAdjacentTaskFragments; + + /** + * Unlike the {@link #mAdjacentTaskFragments}, the companion TaskFragment is not always visually * adjacent to this one, but this TaskFragment will be removed by the organizer if the * companion TaskFragment is removed. */ @@ -442,15 +451,24 @@ class TaskFragment extends WindowContainer<WindowContainer> { return service.mWindowOrganizerController.getTaskFragment(token); } - void setAdjacentTaskFragment(@Nullable TaskFragment taskFragment) { - if (mAdjacentTaskFragment == taskFragment) { - return; - } - resetAdjacentTaskFragment(); - if (taskFragment != null) { + /** @deprecated b/373709676 replace with {@link #setAdjacentTaskFragments}. */ + @Deprecated + void setAdjacentTaskFragment(@NonNull TaskFragment taskFragment) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + if (mAdjacentTaskFragment == taskFragment) { + return; + } + resetAdjacentTaskFragment(); mAdjacentTaskFragment = taskFragment; taskFragment.setAdjacentTaskFragment(this); + return; } + + setAdjacentTaskFragments(new AdjacentSet(this, taskFragment)); + } + + void setAdjacentTaskFragments(@NonNull AdjacentSet adjacentTaskFragments) { + adjacentTaskFragments.setAsAdjacent(); } void setCompanionTaskFragment(@Nullable TaskFragment companionTaskFragment) { @@ -461,7 +479,14 @@ class TaskFragment extends WindowContainer<WindowContainer> { return mCompanionTaskFragment; } - void resetAdjacentTaskFragment() { + /** @deprecated b/373709676 replace with {@link #clearAdjacentTaskFragments()}. */ + @Deprecated + private void resetAdjacentTaskFragment() { + if (Flags.allowMultipleAdjacentTaskFragments()) { + throw new IllegalStateException("resetAdjacentTaskFragment shouldn't be called when" + + " allowMultipleAdjacentTaskFragments is enabled. Use either" + + " #clearAdjacentTaskFragments or #removeFromAdjacentTaskFragments"); + } // Reset the adjacent TaskFragment if its adjacent TaskFragment is also this TaskFragment. if (mAdjacentTaskFragment != null && mAdjacentTaskFragment.mAdjacentTaskFragment == this) { mAdjacentTaskFragment.mAdjacentTaskFragment = null; @@ -471,6 +496,79 @@ class TaskFragment extends WindowContainer<WindowContainer> { mDelayLastActivityRemoval = false; } + void clearAdjacentTaskFragments() { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + resetAdjacentTaskFragment(); + return; + } + + if (mAdjacentTaskFragments != null) { + mAdjacentTaskFragments.clear(); + } + } + + void removeFromAdjacentTaskFragments() { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + resetAdjacentTaskFragment(); + return; + } + + if (mAdjacentTaskFragments != null) { + mAdjacentTaskFragments.remove(this); + } + } + + // TODO(b/373709676): update usages. + /** @deprecated b/373709676 replace with {@link #getAdjacentTaskFragments()}. */ + @Deprecated + @Nullable + TaskFragment getAdjacentTaskFragment() { + return mAdjacentTaskFragment; + } + + @Nullable + AdjacentSet getAdjacentTaskFragments() { + return mAdjacentTaskFragments; + } + + /** + * Runs callback on all TaskFragments that are adjacent to this. The invoke order is not + * guaranteed. + */ + void forOtherAdjacentTaskFragments(@NonNull Consumer<TaskFragment> callback) { + if (mAdjacentTaskFragments == null) { + return; + } + mAdjacentTaskFragments.forAllTaskFragments(callback, this /* exclude */); + } + + /** + * Runs callback on all TaskFragments that are adjacent to this. Returns early if callback + * returns true on any of them. The invoke order is not guaranteed. + */ + boolean forOtherAdjacentTaskFragments(@NonNull Predicate<TaskFragment> callback) { + if (mAdjacentTaskFragments == null) { + return false; + } + return mAdjacentTaskFragments.forAllTaskFragments(callback, this /* exclude */); + } + + boolean hasAdjacentTaskFragment() { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + return mAdjacentTaskFragment != null; + } + return mAdjacentTaskFragments != null; + } + + boolean isAdjacentTo(@NonNull TaskFragment other) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + return mAdjacentTaskFragment == other; + } + return other != this + && mAdjacentTaskFragments != null + && mAdjacentTaskFragments.contains(other); + } + void setTaskFragmentOrganizer(@NonNull TaskFragmentOrganizerToken organizer, int uid, @NonNull String processName) { mTaskFragmentOrganizer = ITaskFragmentOrganizer.Stub.asInterface(organizer.asBinder()); @@ -566,10 +664,6 @@ class TaskFragment extends WindowContainer<WindowContainer> { return isEmbedded() && mPinned; } - TaskFragment getAdjacentTaskFragment() { - return mAdjacentTaskFragment; - } - /** Returns the currently topmost resumed activity. */ @Nullable ActivityRecord getTopResumedActivity() { @@ -616,7 +710,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { mResumedActivity = r; final ActivityRecord topResumed = mTaskSupervisor.updateTopResumedActivityIfNeeded(reason); if (mResumedActivity != null && topResumed != null && topResumed.isEmbedded() - && topResumed.getTaskFragment().getAdjacentTaskFragment() == this) { + && topResumed.getTaskFragment().isAdjacentTo(this)) { // Explicitly updates the last resumed Activity if the resumed activity is // adjacent to the top-resumed embedded activity. mAtmService.setLastResumedActivityUncheckLocked(mResumedActivity, reason); @@ -2036,7 +2130,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { private boolean shouldReportOrientationUnspecified() { // Apps and their containers are not allowed to specify orientation from adjacent // TaskFragment. - return getAdjacentTaskFragment() != null && isVisibleRequested(); + return hasAdjacentTaskFragment() && isVisibleRequested(); } @Override @@ -3086,7 +3180,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { EventLogTags.writeWmTfRemoved(System.identityHashCode(this), getTaskId()); } mIsRemovalRequested = false; - resetAdjacentTaskFragment(); + removeFromAdjacentTaskFragments(); cleanUpEmbeddedTaskFragment(); final boolean shouldExecuteAppTransition = mClearedTaskFragmentForPip && isTaskVisibleRequested(); @@ -3126,24 +3220,47 @@ class TaskFragment extends WindowContainer<WindowContainer> { return false; } - final TaskFragment adjacentTf = getAdjacentTaskFragment(); - if (adjacentTf == null) { + if (!hasAdjacentTaskFragment()) { // early return if no adjacent TF. return false; } - if (getParent().mChildren.indexOf(adjacentTf) < getParent().mChildren.indexOf(this)) { - // early return if this TF already has higher z-ordering. - return false; + final ArrayList<WindowContainer> siblings = getParent().mChildren; + final int zOrder = siblings.indexOf(this); + + if (!Flags.allowMultipleAdjacentTaskFragments()) { + if (siblings.indexOf(getAdjacentTaskFragment()) < zOrder) { + // early return if this TF already has higher z-ordering. + return false; + } + } else { + final boolean hasAdjacentOnTop = forOtherAdjacentTaskFragments( + tf -> siblings.indexOf(tf) > zOrder); + if (!hasAdjacentOnTop) { + // early return if this TF already has higher z-ordering. + return false; + } } - ToBooleanFunction<WindowState> getDimBehindWindow = + final ToBooleanFunction<WindowState> getDimBehindWindow = (w) -> (w.mAttrs.flags & FLAG_DIM_BEHIND) != 0 && w.mActivityRecord != null && w.mActivityRecord.isEmbedded() && (w.mActivityRecord.isVisibleRequested() || w.mActivityRecord.isVisible()); - if (adjacentTf.forAllWindows(getDimBehindWindow, true)) { - // early return if the adjacent Tf has a dimming window. - return false; + + if (!Flags.allowMultipleAdjacentTaskFragments()) { + final TaskFragment adjacentTf = getAdjacentTaskFragment(); + if (adjacentTf.forAllWindows(getDimBehindWindow, true)) { + // early return if the adjacent Tf has a dimming window. + return false; + } + } else { + final boolean adjacentHasDimmingWindow = forOtherAdjacentTaskFragments(tf -> { + return tf.forAllWindows(getDimBehindWindow, true); + }); + if (adjacentHasDimmingWindow) { + // early return if the adjacent Tf has a dimming window. + return false; + } } // boost if there's an Activity window that has FLAG_DIM_BEHIND flag. @@ -3267,9 +3384,16 @@ class TaskFragment extends WindowContainer<WindowContainer> { sb.append(" organizerProc="); sb.append(mTaskFragmentOrganizerProcessName); } - if (mAdjacentTaskFragment != null) { - sb.append(" adjacent="); - sb.append(mAdjacentTaskFragment); + if (Flags.allowMultipleAdjacentTaskFragments()) { + if (mAdjacentTaskFragments != null) { + sb.append(" adjacent="); + sb.append(mAdjacentTaskFragments); + } + } else { + if (mAdjacentTaskFragment != null) { + sb.append(" adjacent="); + sb.append(mAdjacentTaskFragment); + } } sb.append('}'); return sb.toString(); @@ -3385,4 +3509,125 @@ class TaskFragment extends WindowContainer<WindowContainer> { proto.end(token); } + + /** Set of {@link TaskFragment}s that are adjacent to each other. */ + static class AdjacentSet { + private final ArraySet<TaskFragment> mAdjacentSet; + + AdjacentSet(@NonNull TaskFragment... taskFragments) { + this(new ArraySet<>(taskFragments)); + } + + AdjacentSet(@NonNull ArraySet<TaskFragment> taskFragments) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + throw new IllegalStateException("allowMultipleAdjacentTaskFragments must be" + + " enabled to set more than two TaskFragments adjacent to each other."); + } + if (taskFragments.size() < 2) { + throw new IllegalArgumentException("Adjacent TaskFragments must contain at least" + + " two TaskFragments, but only " + taskFragments.size() + + " were provided."); + } + mAdjacentSet = taskFragments; + } + + /** Updates each {@link TaskFragment} in the set to be adjacent to each other. */ + private void setAsAdjacent() { + if (mAdjacentSet.isEmpty() + || equals(mAdjacentSet.valueAt(0).mAdjacentTaskFragments)) { + // No need to update if any TaskFragment in the set has already been updated to the + // same set. + return; + } + for (int i = mAdjacentSet.size() - 1; i >= 0; i--) { + final TaskFragment taskFragment = mAdjacentSet.valueAt(i); + taskFragment.removeFromAdjacentTaskFragments(); + taskFragment.mAdjacentTaskFragments = this; + } + } + + /** Removes the {@link TaskFragment} from the adjacent set. */ + private void remove(@NonNull TaskFragment taskFragment) { + taskFragment.mAdjacentTaskFragments = null; + taskFragment.mDelayLastActivityRemoval = false; + mAdjacentSet.remove(taskFragment); + if (mAdjacentSet.size() < 2) { + // To be considered as adjacent, there must be at least 2 TaskFragments in the set. + clear(); + } + } + + /** Clears the adjacent relationship. */ + private void clear() { + for (int i = mAdjacentSet.size() - 1; i >= 0; i--) { + final TaskFragment taskFragment = mAdjacentSet.valueAt(i); + // Clear all reference. + taskFragment.mAdjacentTaskFragments = null; + taskFragment.mDelayLastActivityRemoval = false; + } + mAdjacentSet.clear(); + } + + /** Whether the {@link TaskFragment} is in this adjacent set. */ + boolean contains(@NonNull TaskFragment taskFragment) { + return mAdjacentSet.contains(taskFragment); + } + + /** + * Runs the callback on all adjacent TaskFragments. Skips the exclude one if not null. + */ + void forAllTaskFragments(@NonNull Consumer<TaskFragment> callback, + @Nullable TaskFragment exclude) { + for (int i = mAdjacentSet.size() - 1; i >= 0; i--) { + final TaskFragment taskFragment = mAdjacentSet.valueAt(i); + if (taskFragment != exclude) { + callback.accept(taskFragment); + } + } + } + + /** + * Runs the callback on all adjacent TaskFragments until one returns {@code true}. Skips the + * exclude one if not null. + */ + boolean forAllTaskFragments(@NonNull Predicate<TaskFragment> callback, + @Nullable TaskFragment exclude) { + for (int i = mAdjacentSet.size() - 1; i >= 0; i--) { + final TaskFragment taskFragment = mAdjacentSet.valueAt(i); + if (taskFragment == exclude) { + continue; + } + if (callback.test(taskFragment)) { + return true; + } + } + return false; + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (!(o instanceof AdjacentSet other)) { + return false; + } + return mAdjacentSet.equals(other.mAdjacentSet); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append("AdjacentSet{"); + final int size = mAdjacentSet.size(); + for (int i = 0; i < size; i++) { + if (i != 0) { + sb.append(", "); + } + sb.append(mAdjacentSet.valueAt(i)); + } + sb.append("}"); + return sb.toString(); + } + } } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotCache.java b/services/core/java/com/android/server/wm/TaskSnapshotCache.java index 64b9df59990b..cc957bd9ee42 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotCache.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotCache.java @@ -48,26 +48,37 @@ class TaskSnapshotCache extends SnapshotCache<Task> { } /** - * If {@param restoreFromDisk} equals {@code true}, DO NOT HOLD THE WINDOW MANAGER LOCK! + * Retrieves a snapshot from cache. */ - @Nullable TaskSnapshot getSnapshot(int taskId, int userId, boolean restoreFromDisk, - boolean isLowResolution) { - final TaskSnapshot snapshot = getSnapshot(taskId); - if (snapshot != null) { - return snapshot; - } + @Nullable TaskSnapshot getSnapshot(int taskId, boolean isLowResolution) { + return getSnapshot(taskId, isLowResolution, TaskSnapshot.REFERENCE_NONE); + } - // Try to restore from disk if asked. - if (!restoreFromDisk) { - return null; + // TODO (b/238206323) Respect isLowResolution. + @Nullable TaskSnapshot getSnapshot(int taskId, boolean isLowResolution, + @TaskSnapshot.ReferenceFlags int usage) { + synchronized (mLock) { + final TaskSnapshot snapshot = getSnapshotInner(taskId); + if (snapshot != null) { + if (usage != TaskSnapshot.REFERENCE_NONE) { + snapshot.addReference(usage); + } + return snapshot; + } } - return tryRestoreFromDisk(taskId, userId, isLowResolution); + return null; } /** - * DO NOT HOLD THE WINDOW MANAGER LOCK WHEN CALLING THIS METHOD! + * Restore snapshot from disk, DO NOT HOLD THE WINDOW MANAGER LOCK! */ - private TaskSnapshot tryRestoreFromDisk(int taskId, int userId, boolean isLowResolution) { - return mLoader.loadTask(taskId, userId, isLowResolution); + @Nullable TaskSnapshot getSnapshotFromDisk(int taskId, int userId, boolean isLowResolution, + @TaskSnapshot.ReferenceFlags int usage) { + final TaskSnapshot snapshot = mLoader.loadTask(taskId, userId, isLowResolution); + // Note: This can be weird if the caller didn't ask for reference. + if (snapshot != null && usage != TaskSnapshot.REFERENCE_NONE) { + snapshot.addReference(usage); + } + return snapshot; } } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index c130931277fe..38a2ebeba332 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -174,14 +174,32 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot } /** - * Retrieves a snapshot. If {@param restoreFromDisk} equals {@code true}, DO NOT HOLD THE WINDOW - * MANAGER LOCK WHEN CALLING THIS METHOD! + * Retrieves a snapshot from cache. */ @Nullable - TaskSnapshot getSnapshot(int taskId, int userId, boolean restoreFromDisk, - boolean isLowResolution) { - return mCache.getSnapshot(taskId, userId, restoreFromDisk, isLowResolution - && mPersistInfoProvider.enableLowResSnapshots()); + TaskSnapshot getSnapshot(int taskId, boolean isLowResolution) { + return getSnapshot(taskId, false /* isLowResolution */, TaskSnapshot.REFERENCE_NONE); + } + + /** + * Retrieves a snapshot from cache. + */ + @Nullable + TaskSnapshot getSnapshot(int taskId, boolean isLowResolution, + @TaskSnapshot.ReferenceFlags int usage) { + return mCache.getSnapshot(taskId, isLowResolution + && mPersistInfoProvider.enableLowResSnapshots(), usage); + } + + /** + * Retrieves a snapshot from disk. + * DO NOT HOLD THE WINDOW MANAGER LOCK WHEN CALLING THIS METHOD! + */ + @Nullable + TaskSnapshot getSnapshotFromDisk(int taskId, int userId, + boolean isLowResolution, @TaskSnapshot.ReferenceFlags int usage) { + return mCache.getSnapshotFromDisk(taskId, userId, isLowResolution + && mPersistInfoProvider.enableLowResSnapshots(), usage); } /** @@ -189,7 +207,7 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot * last taken, or -1 if no such snapshot exists for that task. */ long getSnapshotCaptureTime(int taskId) { - final TaskSnapshot snapshot = mCache.getSnapshot(taskId); + final TaskSnapshot snapshot = mCache.getSnapshot(taskId, false /* isLowResolution */); if (snapshot != null) { return snapshot.getCaptureTime(); } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 1fc609b7d03a..bcd12f253299 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1870,7 +1870,13 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { final DisplayArea<?> da = wc.asDisplayArea(); if (da == null) continue; if (da.isVisibleRequested()) { - mController.mValidateDisplayVis.remove(da); + final int inValidateList = mController.mValidateDisplayVis.indexOf(da); + if (inValidateList >= 0 + // The display-area is visible, but if we only detect a non-visibility + // change, then we shouldn't remove the validator. + && !mChanges.get(da).mVisible) { + mController.mValidateDisplayVis.remove(inValidateList); + } } else { // In case something accidentally hides a displayarea and nothing shows it again. mController.mValidateDisplayVis.add(da); diff --git a/services/core/java/com/android/server/wm/WindowManagerConstants.java b/services/core/java/com/android/server/wm/WindowManagerConstants.java index 3ad9b62ef058..9a5c8dffc0fc 100644 --- a/services/core/java/com/android/server/wm/WindowManagerConstants.java +++ b/services/core/java/com/android/server/wm/WindowManagerConstants.java @@ -42,12 +42,23 @@ final class WindowManagerConstants { * <ul> * <li>false: applies to no apps (default)</li> * <li>true: applies to all apps</li> - * <li>large: applies to all apps but only on large screens</li> * </ul> */ private static final String KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST = "ignore_activity_orientation_request"; + /** + * The orientation of activity will be always "unspecified" except for game apps. + * <p>Possible values: + * <ul> + * <li>none: applies to no apps (default)</li> + * <li>all: applies to all apps ({@see #KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST})</li> + * <li>large: applies to all apps but only on large screens</li> + * </ul> + */ + private static final String KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS = + "ignore_activity_orientation_request_screens"; + /** The packages that ignore {@link #KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST}. */ private static final String KEY_OPT_OUT_IGNORE_ACTIVITY_ORIENTATION_REQUEST_LIST = "opt_out_ignore_activity_orientation_request_list"; @@ -155,6 +166,7 @@ final class WindowManagerConstants { updateSystemGestureExclusionLogDebounceMillis(); break; case KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST: + case KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS: updateIgnoreActivityOrientationRequest(); break; case KEY_OPT_OUT_IGNORE_ACTIVITY_ORIENTATION_REQUEST_LIST: @@ -186,12 +198,16 @@ final class WindowManagerConstants { } private void updateIgnoreActivityOrientationRequest() { - final String value = mDeviceConfig.getProperty( + boolean allScreens = mDeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST, false); + String whichScreens = mDeviceConfig.getProperty( DeviceConfig.NAMESPACE_WINDOW_MANAGER, - KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST); - mIgnoreActivityOrientationRequestSmallScreen = Boolean.parseBoolean(value); - mIgnoreActivityOrientationRequestLargeScreen = mIgnoreActivityOrientationRequestSmallScreen - || ("large".equals(value)); + KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS); + allScreens |= ("all".equalsIgnoreCase(whichScreens)); + boolean largeScreens = allScreens || ("large".equalsIgnoreCase(whichScreens)); + mIgnoreActivityOrientationRequestSmallScreen = allScreens; + mIgnoreActivityOrientationRequestLargeScreen = largeScreens; } private void updateOptOutIgnoreActivityOrientationRequestList() { @@ -221,9 +237,9 @@ final class WindowManagerConstants { pw.print("="); pw.println(mSystemGestureExclusionLimitDp); pw.print(" "); pw.print(KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE); pw.print("="); pw.println(mSystemGestureExcludedByPreQStickyImmersive); - pw.print(" "); pw.print(KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST); - pw.print("="); pw.println(mIgnoreActivityOrientationRequestSmallScreen ? "true" - : mIgnoreActivityOrientationRequestLargeScreen ? "large" : "false"); + pw.print(" "); pw.print(KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS); + pw.print("="); pw.println(mIgnoreActivityOrientationRequestSmallScreen ? "all" + : mIgnoreActivityOrientationRequestLargeScreen ? "large" : "none"); if (mOptOutIgnoreActivityOrientationRequestPackages != null) { pw.print(" "); pw.print(KEY_OPT_OUT_IGNORE_ACTIVITY_ORIENTATION_REQUEST_LIST); pw.print("="); pw.println(mOptOutIgnoreActivityOrientationRequestPackages); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0b6ca75c5f0d..9d9c53dfe0f4 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2673,7 +2673,7 @@ public class WindowManagerService extends IWindowManager.Stub if (outRelayoutResult != null) { if (win.syncNextBuffer() && viewVisibility == View.VISIBLE - && win.mSyncSeqId > lastSyncSeqId) { + && win.mSyncSeqId > lastSyncSeqId && !displayContent.mWaitingForConfig) { outRelayoutResult.syncSeqId = win.shouldSyncWithBuffers() ? win.mSyncSeqId : -1; @@ -4292,16 +4292,6 @@ public class WindowManagerService extends IWindowManager.Stub } /** - * Retrieves a snapshot. If restoreFromDisk equals equals {@code true}, DO NOT HOLD THE WINDOW - * MANAGER LOCK WHEN CALLING THIS METHOD! - */ - public TaskSnapshot getTaskSnapshot(int taskId, int userId, boolean isLowResolution, - boolean restoreFromDisk) { - return mTaskSnapshotController.getSnapshot(taskId, userId, restoreFromDisk, - isLowResolution); - } - - /** * Generates and returns an up-to-date {@link Bitmap} for the specified taskId. * * @param taskId The task ID of the task for which a Bitmap is requested. @@ -9142,9 +9132,13 @@ public class WindowManagerService extends IWindowManager.Stub private void handlePointerDownOutsideFocus(InputTarget t, InputTarget focusedInputTarget) { synchronized (mGlobalLock) { - if (mFocusedInputTarget != focusedInputTarget) { - // Skip if the mFocusedInputTarget is already changed. This is possible if the - // pointer-down-outside-focus event is delayed to be handled. + final WindowState w = t.getWindowState(); + // Skip if the mFocusedInputTarget is already changed or the touched Activity is no + // longer visible. This is possible if the pointer-down-outside-focus event is + // delayed to be handled. + if (mFocusedInputTarget != focusedInputTarget || (w != null + && w.getActivityRecord() != null + && !w.getActivityRecord().isVisibleRequested())) { ProtoLog.i(WM_DEBUG_FOCUS_LIGHT, "Skip onPointerDownOutsideFocusLocked due to input target changed %s", t); return; @@ -9156,7 +9150,6 @@ public class WindowManagerService extends IWindowManager.Stub } clearPointerDownOutsideFocusRunnable(); - final WindowState w = t.getWindowState(); if (w != null) { final Task task = w.getTask(); if (task != null && w.mTransitionController.isTransientHide(task)) { @@ -10021,11 +10014,10 @@ public class WindowManagerService extends IWindowManager.Stub && imeTargetWindow.mActivityRecord.mLastImeShown) { return true; } + final TaskSnapshot snapshot = mTaskSnapshotController.getSnapshot( + imeTargetWindowTask.mTaskId, false /* isLowResolution */); + return snapshot != null && snapshot.hasImeSurface(); } - final TaskSnapshot snapshot = getTaskSnapshot(imeTargetWindowTask.mTaskId, - imeTargetWindowTask.mUserId, false /* isLowResolution */, - false /* restoreFromDisk */); - return snapshot != null && snapshot.hasImeSurface(); } @Override diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 66921ff3adeb..fb197c566b7d 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -1155,7 +1155,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } else if (!task.mCreatedByOrganizer) { throw new UnsupportedOperationException( "Cannot set non-organized task as adjacent flag root: " + wc); - } else if (task.getAdjacentTaskFragment() == null && !clearRoot) { + } else if (!task.hasAdjacentTaskFragment() && !clearRoot) { throw new UnsupportedOperationException( "Cannot set non-adjacent task as adjacent flag root: " + wc); } @@ -1645,9 +1645,15 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub opType, exception); break; } - if (taskFragment.getAdjacentTaskFragment() != secondaryTaskFragment) { + if (!taskFragment.isAdjacentTo(secondaryTaskFragment)) { // Only have lifecycle effect if the adjacent changed. - taskFragment.setAdjacentTaskFragment(secondaryTaskFragment); + if (Flags.allowMultipleAdjacentTaskFragments()) { + // Activity Embedding only set two TFs adjacent. + taskFragment.setAdjacentTaskFragments( + new TaskFragment.AdjacentSet(taskFragment, secondaryTaskFragment)); + } else { + taskFragment.setAdjacentTaskFragment(secondaryTaskFragment); + } effects |= TRANSACT_EFFECTS_LIFECYCLE; } @@ -1663,21 +1669,25 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub break; } case OP_TYPE_CLEAR_ADJACENT_TASK_FRAGMENTS: { - final TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment(); - if (adjacentTaskFragment == null) { + if (!taskFragment.hasAdjacentTaskFragment()) { break; } - taskFragment.resetAdjacentTaskFragment(); - effects |= TRANSACT_EFFECTS_LIFECYCLE; - // Clear the focused app if the focused app is no longer visible after reset the - // adjacent TaskFragments. + // Check if the focused app is in the adjacent set that will be cleared. final ActivityRecord focusedApp = taskFragment.getDisplayContent().mFocusedApp; final TaskFragment focusedTaskFragment = focusedApp != null ? focusedApp.getTaskFragment() : null; - if ((focusedTaskFragment == taskFragment - || focusedTaskFragment == adjacentTaskFragment) + final boolean wasFocusedInAdjacent = focusedTaskFragment == taskFragment + || (focusedTaskFragment != null + && taskFragment.isAdjacentTo(focusedTaskFragment)); + + taskFragment.removeFromAdjacentTaskFragments(); + effects |= TRANSACT_EFFECTS_LIFECYCLE; + + // Clear the focused app if the focused app is no longer visible after reset the + // adjacent TaskFragments. + if (wasFocusedInAdjacent && !focusedTaskFragment.shouldBeVisible(null /* starting */)) { focusedTaskFragment.getDisplayContent().setFocusedApp(null /* newFocus */); } @@ -2191,26 +2201,60 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } private int setAdjacentRootsHierarchyOp(WindowContainerTransaction.HierarchyOp hop) { - final WindowContainer wc1 = WindowContainer.fromBinder(hop.getContainer()); - if (wc1 == null || !wc1.isAttached()) { - Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc1); - return TRANSACT_EFFECTS_NONE; - } - final TaskFragment root1 = wc1.asTaskFragment(); - final WindowContainer wc2 = WindowContainer.fromBinder(hop.getAdjacentRoot()); - if (wc2 == null || !wc2.isAttached()) { - Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc2); - return TRANSACT_EFFECTS_NONE; - } - final TaskFragment root2 = wc2.asTaskFragment(); - if (!root1.mCreatedByOrganizer || !root2.mCreatedByOrganizer) { - throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not created by" - + " organizer root1=" + root1 + " root2=" + root2); - } - if (root1.getAdjacentTaskFragment() == root2) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + final WindowContainer wc1 = WindowContainer.fromBinder(hop.getContainer()); + if (wc1 == null || !wc1.isAttached()) { + Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc1); + return TRANSACT_EFFECTS_NONE; + } + final TaskFragment root1 = wc1.asTaskFragment(); + final WindowContainer wc2 = WindowContainer.fromBinder(hop.getAdjacentRoot()); + if (wc2 == null || !wc2.isAttached()) { + Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc2); + return TRANSACT_EFFECTS_NONE; + } + final TaskFragment root2 = wc2.asTaskFragment(); + if (!root1.mCreatedByOrganizer || !root2.mCreatedByOrganizer) { + throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not created by" + + " organizer root1=" + root1 + " root2=" + root2); + } + if (root1.isAdjacentTo(root2)) { + return TRANSACT_EFFECTS_NONE; + } + root1.setAdjacentTaskFragment(root2); + return TRANSACT_EFFECTS_LIFECYCLE; + } + + final IBinder[] containers = hop.getContainers(); + final ArraySet<TaskFragment> adjacentRoots = new ArraySet<>(); + for (IBinder container : containers) { + final WindowContainer wc = WindowContainer.fromBinder(container); + if (wc == null || !wc.isAttached()) { + Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc); + return TRANSACT_EFFECTS_NONE; + } + final Task root = wc.asTask(); + if (root == null) { + // Only support Task. Use WCT#setAdjacentTaskFragments for non-Task TaskFragment. + throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not called with" + + " Task. wc=" + wc); + } + if (!root.mCreatedByOrganizer) { + throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not created by" + + " organizer root=" + root); + } + if (adjacentRoots.contains(root)) { + throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: called with same" + + " root twice=" + root); + } + adjacentRoots.add(root); + } + final TaskFragment root0 = adjacentRoots.valueAt(0); + final TaskFragment.AdjacentSet adjacentSet = new TaskFragment.AdjacentSet(adjacentRoots); + if (adjacentSet.equals(root0.getAdjacentTaskFragments())) { return TRANSACT_EFFECTS_NONE; } - root1.setAdjacentTaskFragment(root2); + root0.setAdjacentTaskFragments(adjacentSet); return TRANSACT_EFFECTS_LIFECYCLE; } @@ -2225,10 +2269,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub throw new IllegalArgumentException("clearAdjacentRootsHierarchyOp: Not created by" + " organizer root=" + root); } - if (root.getAdjacentTaskFragment() == null) { + if (!root.hasAdjacentTaskFragment()) { return TRANSACT_EFFECTS_NONE; } - root.resetAdjacentTaskFragment(); + root.removeFromAdjacentTaskFragments(); return TRANSACT_EFFECTS_LIFECYCLE; } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 7f0c33657144..80e4c30b73f8 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1263,7 +1263,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio if (windowingMode == WINDOWING_MODE_MULTI_WINDOW && com.android.window.flags.Flags .processPriorityPolicyForMultiWindowMode() - && task.getAdjacentTask() != null) { + && task.hasAdjacentTask()) { stateFlags |= ACTIVITY_STATE_FLAG_RESUMED_SPLIT_SCREEN; } else if (windowingMode == WINDOWING_MODE_FREEFORM) { hasResumedFreeform = true; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 447d443282bd..90bf053dfbef 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3311,8 +3311,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // Because the client is notified to be invisible, it should no longer be considered as // drawn state. This prevent the app from showing incomplete content if the app is // requested to be visible in a short time (e.g. before activity stopped). - if (Flags.resetDrawStateOnClientInvisible() && !clientVisible && mActivityRecord != null - && mWinAnimator.mDrawState == HAS_DRAWN) { + if (!clientVisible && mActivityRecord != null && mWinAnimator.mDrawState == HAS_DRAWN) { mWinAnimator.resetDrawState(); // Make sure the app can report drawn if it becomes visible again. forceReportingResized(); @@ -5750,10 +5749,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP || mKeyInterceptionInfo.layoutParamsPrivateFlags != getAttrs().privateFlags || mKeyInterceptionInfo.layoutParamsType != getAttrs().type || mKeyInterceptionInfo.windowTitle != getWindowTag() - || mKeyInterceptionInfo.windowOwnerUid != getOwningUid() - || mKeyInterceptionInfo.inputFeaturesFlags != getAttrs().inputFeatures) { + || mKeyInterceptionInfo.windowOwnerUid != getOwningUid()) { mKeyInterceptionInfo = new KeyInterceptionInfo(getAttrs().type, getAttrs().privateFlags, - getWindowTag().toString(), getOwningUid(), getAttrs().inputFeatures); + getWindowTag().toString(), getOwningUid()); } return mKeyInterceptionInfo; } diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 4c0cee404b68..82699ea3badb 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -11,7 +11,6 @@ cc_library_static { name: "libservices.core", defaults: ["libservices.core-libs"], - cpp_std: "c++2a", cflags: [ "-Wall", "-Werror", diff --git a/services/core/jni/com_android_server_am_Freezer.cpp b/services/core/jni/com_android_server_am_Freezer.cpp index 81487281dee7..e9a99f0fab64 100644 --- a/services/core/jni/com_android_server_am_Freezer.cpp +++ b/services/core/jni/com_android_server_am_Freezer.cpp @@ -68,7 +68,7 @@ jint getBinderFreezeInfo(JNIEnv *env, jobject, jint pid) { bool isFreezerSupported(JNIEnv *env, jclass) { std::string path; - if (!getAttributePathForTask("FreezerState", getpid(), &path)) { + if (!CgroupGetAttributePathForTask("FreezerState", getpid(), &path)) { ALOGI("No attribute for FreezerState"); return false; } diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java index 0c9a89bb0a30..8533eafaf9e0 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java @@ -114,7 +114,7 @@ public class CredentialManagerUi { /** Creates intent that is ot be invoked to cancel an in-progress UI session. */ public Intent createCancelIntent(IBinder requestId, String packageName) { return IntentFactory.createCancelUiIntent(mContext, requestId, - /*shouldShowCancellationUi=*/ true, packageName); + /*shouldShowCancellationUi=*/ true, packageName, mUserId); } /** @@ -177,7 +177,7 @@ public class CredentialManagerUi { IntentCreationResult intentCreationResult = IntentFactory .createCredentialSelectorIntentForCredMan(mContext, requestInfo, providerDataList, - new ArrayList<>(disabledProviderDataList), mResultReceiver); + new ArrayList<>(disabledProviderDataList), mResultReceiver, mUserId); requestSessionMetric.collectUiConfigurationResults( mContext, intentCreationResult, mUserId); Intent intent = intentCreationResult.getIntent(); @@ -211,7 +211,7 @@ public class CredentialManagerUi { RequestSessionMetric requestSessionMetric) { IntentCreationResult intentCreationResult = IntentFactory .createCredentialSelectorIntentForAutofill(mContext, requestInfo, new ArrayList<>(), - mResultReceiver); + mResultReceiver, mUserId); requestSessionMetric.collectUiConfigurationResults( mContext, intentCreationResult, mUserId); return intentCreationResult.getIntent(); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 92dbf63b3cf7..29e0487dad0a 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -293,6 +293,7 @@ import com.android.server.usage.StorageStatsService; import com.android.server.usage.UsageStatsService; import com.android.server.usb.UsbService; import com.android.server.utils.TimingsTraceAndSlog; +import com.android.server.vcn.VcnLocation; import com.android.server.vibrator.VibratorManagerService; import com.android.server.voiceinteraction.VoiceInteractionManagerService; import com.android.server.vr.VrManagerService; @@ -1929,6 +1930,10 @@ public final class SystemServer implements Dumpable { } t.traceEnd(); + t.traceBegin("UpdateMetricsIfNeeded"); + mPackageManagerService.updateMetricsIfNeeded(); + t.traceEnd(); + t.traceBegin("PerformFstrimIfNeeded"); try { mPackageManagerService.performFstrimIfNeeded(); @@ -2234,10 +2239,13 @@ public final class SystemServer implements Dumpable { t.traceBegin("StartVcnManagementService"); try { - // TODO: b/375213246 When VCN is in mainline module, load it from the apex path. - // Whether VCN will be in apex or in the platform will be gated by a build system - // flag. - mSystemServiceManager.startService(CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS); + if (VcnLocation.IS_VCN_IN_MAINLINE) { + mSystemServiceManager.startServiceFromJar( + CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS, + CONNECTIVITY_SERVICE_APEX_PATH); + } else { + mSystemServiceManager.startService(CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS); + } } catch (Throwable e) { reportWtf("starting VCN Management Service", e); } diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java index acd34e323dc2..0ae7699aeb71 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java @@ -233,6 +233,6 @@ public class BroadcastHelperTest { mBroadcastHelper.sendPackageChangedBroadcast(mMockSnapshot, PACKAGE_CHANGED_TEST_PACKAGE_NAME, true /* dontKillApp */, componentNames, - UserHandle.USER_SYSTEM, "test" /* reason */); + UserHandle.USER_SYSTEM, "test" /* reason */, "test" /* reasonForTrace */); } } diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java index 365cbaed2aac..724f083018f2 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -3708,7 +3708,7 @@ public class DisplayManagerServiceTest { eq(config)); bs.releaseVirtualDisplay(mMockAppToken); - verify(mMockVirtualDisplayAdapter).releaseVirtualDisplayLocked(binder, callingUid); + verify(mMockVirtualDisplayAdapter).releaseVirtualDisplayLocked(binder); } @Test diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java index 91f1aaf603e6..8ca39194de3b 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -2471,6 +2471,26 @@ public final class DisplayPowerControllerTest { eq(false)); } + @Test + public void onDisplayChange_canceledAfterStop() { + mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); + + // stop the dpc (turn it down) + mHolder.dpc.stop(); + advanceTime(1); + + // To trigger all the changes that can happen, we will completely change the underlying + // display device. + setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), + mock(DisplayDeviceConfig.class), /* isEnabled= */ true); + + // Call onDisplayChange after we stopped DPC and make sure it doesn't crash + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + advanceTime(1); + + // No crash = success + } + /** * Creates a mock and registers it to {@link LocalServices}. */ diff --git a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java index dbd5c65f9ba3..9287b3004279 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java @@ -118,14 +118,13 @@ public class VirtualDisplayAdapterTest { public void testCreateAndReleaseVirtualDisplay() { VirtualDisplayConfig config = new VirtualDisplayConfig.Builder("test", /* width= */ 1, /* height= */ 1, /* densityDpi= */ 1).build(); - int ownerUid = 10; DisplayDevice result = mAdapter.createVirtualDisplayLocked(mMockCallback, - /* projection= */ null, ownerUid, /* packageName= */ "testpackage", + /* projection= */ null, /* ownerUid= */ 10, /* packageName= */ "testpackage", /* uniqueId= */ "uniqueId", /* surface= */ null, /* flags= */ 0, config); assertNotNull(result); - result = mAdapter.releaseVirtualDisplayLocked(mMockBinder, ownerUid); + result = mAdapter.releaseVirtualDisplayLocked(mMockBinder); assertNotNull(result); } @@ -230,7 +229,6 @@ public class VirtualDisplayAdapterTest { // Displays for the same package for (int i = 0; i < MAX_DEVICES_PER_PACKAGE * 2; i++) { - // Same owner UID IVirtualDisplayCallback callback = createCallback(); DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock, 1234, "test.package", "123", @@ -240,7 +238,6 @@ public class VirtualDisplayAdapterTest { // Displays for different packages for (int i = 0; i < MAX_DEVICES * 2; i++) { - // Same owner UID IVirtualDisplayCallback callback = createCallback(); DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock, 1234 + i, "test.package", "123", @@ -270,8 +267,7 @@ public class VirtualDisplayAdapterTest { } // Release one display - DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder(), - ownerUid); + DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder()); assertNotNull(device); callbacks.remove(0); @@ -292,7 +288,7 @@ public class VirtualDisplayAdapterTest { // Release all the displays for (IVirtualDisplayCallback cb : callbacks) { - device = mAdapter.releaseVirtualDisplayLocked(cb.asBinder(), ownerUid); + device = mAdapter.releaseVirtualDisplayLocked(cb.asBinder()); assertNotNull(device); } callbacks.clear(); @@ -342,8 +338,7 @@ public class VirtualDisplayAdapterTest { } // Release one display - DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder(), - firstOwnerUid); + DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder()); assertNotNull(device); callbacks.remove(0); @@ -363,9 +358,8 @@ public class VirtualDisplayAdapterTest { assertNull(device); // Release all the displays - for (int i = 0; i < callbacks.size(); i++) { - device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(i).asBinder(), - firstOwnerUid + i); + for (IVirtualDisplayCallback iVirtualDisplayCallback : callbacks) { + device = mAdapter.releaseVirtualDisplayLocked(iVirtualDisplayCallback.asBinder()); assertNotNull(device); } callbacks.clear(); diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/RejectedModesVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/RejectedModesVoteTest.kt new file mode 100644 index 000000000000..dd3211d0ef83 --- /dev/null +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/RejectedModesVoteTest.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.display.mode + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class RejectedModesVoteTest { + private val rejectedModes = setOf(1, 2) + + private val otherMode = 2 + + private lateinit var rejectedModesVote: RejectedModesVote + + @Before + fun setUp() { + rejectedModesVote = RejectedModesVote(rejectedModes) + } + + @Test + fun addsRejectedModeIds_summaryIsEmpty() { + val summary = createVotesSummary() + + rejectedModesVote.updateSummary(summary) + + assertThat(summary.rejectedModeIds).containsExactlyElementsIn(rejectedModes) + } + + @Test + fun addsRejectedModeIds_summaryIsNotEmpty() { + val summary = createVotesSummary() + summary.rejectedModeIds.add(otherMode) + + rejectedModesVote.updateSummary(summary) + + assertThat(summary.rejectedModeIds).containsExactlyElementsIn(rejectedModes + otherMode) + } +}
\ No newline at end of file diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt index 239e59b69187..958cf21a38a2 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt @@ -186,6 +186,44 @@ class VoteSummaryTest { assertThat(result).hasSize(1) } + + enum class RejectedModesTestCase( + internal val summaryRejectedModes: Set<Int>?, + val modesToFilter: Array<Display.Mode>, + val expectedModeIds: Set<Int> + ) { + HAS_NO_MATCHING_VOTE( + setOf(4, 5), + arrayOf(createMode(1, 90f, 90f), + createMode(2, 90f, 60f), + createMode(3, 60f, 90f)), + setOf(1, 2, 3) + ), + HAS_SINGLE_MATCHING_VOTE( + setOf(1), + arrayOf(createMode(1, 90f, 90f), + createMode(2, 90f, 60f), + createMode(3, 60f, 90f)), + setOf(2, 3) + ), + HAS_MULTIPLE_MATCHING_VOTES( + setOf(1, 2), + arrayOf(createMode(1, 90f, 90f), + createMode(2, 90f, 60f), + createMode(3, 60f, 90f)), + setOf(3) + ), + } + + @Test + fun testFilterModes_rejectedModes(@TestParameter testCase: RejectedModesTestCase) { + val summary = createSummary() + summary.rejectedModeIds = testCase.summaryRejectedModes + + val result = summary.filterModes(testCase.modesToFilter) + + assertThat(result.map {it.modeId}).containsExactlyElementsIn(testCase.expectedModeIds) + } } diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java index 874e99173c63..495e853370ee 100644 --- a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java +++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java @@ -46,7 +46,6 @@ import android.os.RemoteException; import android.os.test.TestLooper; import android.service.dreams.IDreamService; -import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -108,10 +107,8 @@ public class DreamControllerTest { .thenReturn(Context.ACTIVITY_TASK_SERVICE); final PowerManager powerManager = new PowerManager(mContext, mPowerManager, null, null); - when(mContext.getSystemService(Context.POWER_SERVICE)) + when(mContext.getSystemService(PowerManager.class)) .thenReturn(powerManager); - when(mContext.getSystemServiceName(PowerManager.class)) - .thenReturn(Context.POWER_SERVICE); when(mContext.getResources()).thenReturn(mResources); mToken = new Binder(); @@ -234,8 +231,13 @@ public class DreamControllerTest { } @Test - @FlakyTest(bugId = 293109503) public void serviceDisconnect_resetsScreenTimeout() throws RemoteException { + when(mResources.getBoolean( + com.android.internal.R.bool.config_resetScreenTimeoutOnUnexpectedDreamExit)) + .thenReturn(true); + // Recreate DreamManager because the configuration gets retrieved in the constructor + mDreamController = new DreamController(mContext, mHandler, mListener); + // Start dream. mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/, 0 /*userId*/, null /*wakeLock*/, mOverlayName, "test" /*reason*/); @@ -254,8 +256,13 @@ public class DreamControllerTest { } @Test - @FlakyTest(bugId = 293109503) public void binderDied_resetsScreenTimeout() throws RemoteException { + when(mResources.getBoolean( + com.android.internal.R.bool.config_resetScreenTimeoutOnUnexpectedDreamExit)) + .thenReturn(true); + // Recreate DreamManager because the configuration gets retrieved in the constructor + mDreamController = new DreamController(mContext, mHandler, mListener); + // Start dream. mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/, 0 /*userId*/, null /*wakeLock*/, mOverlayName, "test" /*reason*/); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java index c831475577d8..1e7a4f6cf51b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -83,6 +83,7 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.WorkSource; import android.os.WorkSource.WorkChain; +import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; @@ -2319,11 +2320,12 @@ public class JobSchedulerServiceTest { } /** - * Tests that jobs scheduled through a proxy (eg. system server) don't count towards scheduling + * Tests that jobs scheduled through a proxy (eg. system server) count towards scheduling * limits. */ @Test - public void testScheduleLimiting_Proxy() { + @DisableFlags(Flags.FLAG_ENFORCE_SCHEDULE_LIMIT_TO_PROXY_JOBS) + public void testScheduleLimiting_Proxy_NotCountTowardsLimit() { mService.mConstants.ENABLE_API_QUOTAS = true; mService.mConstants.API_QUOTA_SCHEDULE_COUNT = 300; mService.mConstants.API_QUOTA_SCHEDULE_WINDOW_MS = 300000; @@ -2342,6 +2344,32 @@ public class JobSchedulerServiceTest { } /** + * Tests that jobs scheduled through a proxy (eg. system server) don't count towards scheduling + * limits. + */ + @Test + @EnableFlags(Flags.FLAG_ENFORCE_SCHEDULE_LIMIT_TO_PROXY_JOBS) + public void testScheduleLimiting_Proxy_CountTowardsLimit() { + mService.mConstants.ENABLE_API_QUOTAS = true; + mService.mConstants.API_QUOTA_SCHEDULE_COUNT = 300; + mService.mConstants.API_QUOTA_SCHEDULE_WINDOW_MS = 300000; + mService.mConstants.API_QUOTA_SCHEDULE_THROW_EXCEPTION = false; + mService.mConstants.API_QUOTA_SCHEDULE_RETURN_FAILURE_RESULT = true; + mService.updateQuotaTracker(); + mService.resetScheduleQuota(); + + final JobInfo job = createJobInfo().setPersisted(true).build(); + for (int i = 0; i < 500; ++i) { + final int expected = + i < 300 ? JobScheduler.RESULT_SUCCESS : JobScheduler.RESULT_FAILURE; + assertEquals("Got unexpected result for schedule #" + (i + 1), + expected, + mService.scheduleAsPackage(job, null, TEST_UID, "proxied.package", 0, "JSSTest", + "")); + } + } + + /** * Tests that jobs scheduled by an app for itself as if through a proxy are counted towards * scheduling limits. */ diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java index 0304a74f7654..cd8d415bdfa2 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java @@ -21,11 +21,7 @@ import static android.content.pm.Flags.FLAG_SDK_DEPENDENCY_INSTALLER; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.SharedLibraryInfo; @@ -90,32 +86,15 @@ public class InstallDependencyHelperTest { } @Test - public void testResolveLibraryDependenciesIfNeeded_errorInSharedLibrariesImpl() - throws Exception { - doThrow(new PackageManagerException(new Exception("xyz"))) - .when(mSharedLibraries).collectMissingSharedLibraryInfos(any()); - - PackageLite pkg = getPackageLite(TEST_APP_USING_SDK1_AND_SDK2); - CallbackHelper callback = new CallbackHelper(/*expectSuccess=*/ false); - mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(pkg, mComputer, - 0, mHandler, callback); - callback.assertFailure(); - - assertThat(callback.error).hasMessageThat().contains("xyz"); - } - - @Test public void testResolveLibraryDependenciesIfNeeded_failsToBind() throws Exception { // Return a non-empty list as missing dependency PackageLite pkg = getPackageLite(TEST_APP_USING_SDK1_AND_SDK2); List<SharedLibraryInfo> missingDependency = Collections.singletonList( mock(SharedLibraryInfo.class)); - when(mSharedLibraries.collectMissingSharedLibraryInfos(eq(pkg))) - .thenReturn(missingDependency); CallbackHelper callback = new CallbackHelper(/*expectSuccess=*/ false); - mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(pkg, mComputer, - 0, mHandler, callback); + mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(missingDependency, pkg, + mComputer, 0, mHandler, callback); callback.assertFailure(); assertThat(callback.error).hasMessageThat().contains( @@ -128,12 +107,10 @@ public class InstallDependencyHelperTest { // Return an empty list as missing dependency PackageLite pkg = getPackageLite(TEST_APP_USING_SDK1_AND_SDK2); List<SharedLibraryInfo> missingDependency = Collections.emptyList(); - when(mSharedLibraries.collectMissingSharedLibraryInfos(eq(pkg))) - .thenReturn(missingDependency); CallbackHelper callback = new CallbackHelper(/*expectSuccess=*/ true); - mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(pkg, mComputer, - 0, mHandler, callback); + mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(missingDependency, pkg, + mComputer, 0, mHandler, callback); callback.assertSuccess(); } diff --git a/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java index 7248833d876c..b166514ce0b9 100644 --- a/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java +++ b/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java @@ -64,6 +64,7 @@ import android.os.Binder; import android.os.CpuHeadroomParamsInternal; import android.os.GpuHeadroomParamsInternal; import android.os.IBinder; +import android.os.IHintManager; import android.os.IHintSession; import android.os.PerformanceHintManager; import android.os.Process; @@ -154,6 +155,8 @@ public class HintManagerServiceTest { private ActivityManagerInternal mAmInternalMock; @Mock private PackageManager mMockPackageManager; + @Mock + private IHintManager.IHintManagerClient mClientCallback; @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @@ -171,6 +174,23 @@ public class HintManagerServiceTest { }; } + private SupportInfo makeDefaultSupportInfo() { + mSupportInfo = new SupportInfo(); + mSupportInfo.usesSessions = true; + // By default, mark everything as fully supported + mSupportInfo.sessionHints = -1; + mSupportInfo.sessionModes = -1; + mSupportInfo.modes = -1; + mSupportInfo.boosts = -1; + mSupportInfo.sessionTags = -1; + mSupportInfo.headroom = new SupportInfo.HeadroomSupportInfo(); + mSupportInfo.headroom.isCpuSupported = true; + mSupportInfo.headroom.cpuMinIntervalMillis = 2000; + mSupportInfo.headroom.isGpuSupported = true; + mSupportInfo.headroom.gpuMinIntervalMillis = 2000; + return mSupportInfo; + } + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -181,12 +201,7 @@ public class HintManagerServiceTest { mConfig.eventFlagDescriptor = new MQDescriptor<Byte, Byte>(); ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.category = ApplicationInfo.CATEGORY_GAME; - mSupportInfo = new SupportInfo(); - mSupportInfo.headroom = new SupportInfo.HeadroomSupportInfo(); - mSupportInfo.headroom.isCpuSupported = true; - mSupportInfo.headroom.cpuMinIntervalMillis = 2000; - mSupportInfo.headroom.isGpuSupported = true; - mSupportInfo.headroom.gpuMinIntervalMillis = 2000; + mSupportInfo = makeDefaultSupportInfo(); when(mContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockPackageManager.getNameForUid(anyInt())).thenReturn(TEST_APP_NAME); when(mMockPackageManager.getApplicationInfo(eq(TEST_APP_NAME), anyInt())) @@ -215,6 +230,7 @@ public class HintManagerServiceTest { when(mIPowerMock.getInterfaceVersion()).thenReturn(6); when(mIPowerMock.getSupportInfo()).thenReturn(mSupportInfo); when(mIPowerMock.getSessionChannel(anyInt(), anyInt())).thenReturn(mConfig); + when(mIPowerMock.getSupportInfo()).thenReturn(mSupportInfo); LocalServices.removeServiceForTest(ActivityManagerInternal.class); LocalServices.addService(ActivityManagerInternal.class, mAmInternalMock); } @@ -409,8 +425,11 @@ public class HintManagerServiceTest { HintManagerService service = createService(); IBinder token = new Binder(); - final int threadCount = - service.getBinderServiceInstance().getMaxGraphicsPipelineThreadsCount(); + IHintManager.HintManagerClientData data = service.getBinderServiceInstance() + .registerClient(mClientCallback); + + final int threadCount = data.maxGraphicsPipelineThreads; + long sessionPtr1 = 1111L; long sessionId1 = 11111L; CountDownLatch stopLatch1 = new CountDownLatch(1); @@ -1400,4 +1419,67 @@ public class HintManagerServiceTest { verify(mIPowerMock, times(1)).getGpuHeadroom(eq(halParams1)); verify(mIPowerMock, times(1)).getGpuHeadroom(eq(halParams2)); } + + @Test + public void testRegisteringClient() throws Exception { + HintManagerService service = createService(); + IHintManager.HintManagerClientData data = service.getBinderServiceInstance() + .registerClient(mClientCallback); + assertNotNull(data); + assertEquals(data.supportInfo, mSupportInfo); + } + + @Test + public void testRegisteringClientOnV4() throws Exception { + when(mIPowerMock.getInterfaceVersion()).thenReturn(4); + HintManagerService service = createService(); + IHintManager.HintManagerClientData data = service.getBinderServiceInstance() + .registerClient(mClientCallback); + assertNotNull(data); + assertEquals(data.supportInfo.usesSessions, true); + assertEquals(data.supportInfo.boosts, 0); + assertEquals(data.supportInfo.modes, 0); + assertEquals(data.supportInfo.sessionHints, 31); + assertEquals(data.supportInfo.sessionModes, 0); + assertEquals(data.supportInfo.sessionTags, 0); + assertEquals(data.powerHalVersion, 4); + assertEquals(data.preferredRateNanos, DEFAULT_HINT_PREFERRED_RATE); + } + + @Test + public void testRegisteringClientOnV5() throws Exception { + when(mIPowerMock.getInterfaceVersion()).thenReturn(5); + HintManagerService service = createService(); + IHintManager.HintManagerClientData data = service.getBinderServiceInstance() + .registerClient(mClientCallback); + assertNotNull(data); + assertEquals(data.supportInfo.usesSessions, true); + assertEquals(data.supportInfo.boosts, 0); + assertEquals(data.supportInfo.modes, 0); + assertEquals(data.supportInfo.sessionHints, 255); + assertEquals(data.supportInfo.sessionModes, 1); + assertEquals(data.supportInfo.sessionTags, 31); + assertEquals(data.powerHalVersion, 5); + assertEquals(data.preferredRateNanos, DEFAULT_HINT_PREFERRED_RATE); + } + + @Test + public void testSettingUpOldClientWhenUnsupported() throws Exception { + when(mIPowerMock.getInterfaceVersion()).thenReturn(5); + // Mock unsupported to modify the default support behavior + when(mNativeWrapperMock.halGetHintSessionPreferredRate()) + .thenReturn(-1L); + HintManagerService service = createService(); + IHintManager.HintManagerClientData data = service.getBinderServiceInstance() + .registerClient(mClientCallback); + assertNotNull(data); + assertEquals(data.supportInfo.usesSessions, false); + assertEquals(data.supportInfo.boosts, 0); + assertEquals(data.supportInfo.modes, 0); + assertEquals(data.supportInfo.sessionHints, 0); + assertEquals(data.supportInfo.sessionModes, 0); + assertEquals(data.supportInfo.sessionTags, 0); + assertEquals(data.powerHalVersion, 5); + assertEquals(data.preferredRateNanos, -1); + } } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java index 709f83ba907d..73dcfe77e67f 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java @@ -36,6 +36,7 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.ConditionVariable; +import android.os.Handler; import android.os.Parcel; import android.os.Process; import android.os.UidBatteryConsumer; @@ -81,8 +82,9 @@ public class BatteryUsageStatsProviderTest { .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0); private MockClock mMockClock = mStatsRule.getMockClock(); - private MonotonicClock mMonotonicClock = new MonotonicClock(666777, mMockClock); + private MonotonicClock mMonotonicClock = mStatsRule.getMonotonicClock(); private Context mContext; + private PowerStatsStore mPowerStatsStore; @Before public void setup() throws IOException { @@ -93,6 +95,9 @@ public class BatteryUsageStatsProviderTest { } else { mContext = InstrumentationRegistry.getContext(); } + mPowerStatsStore = spy(new PowerStatsStore( + new File(mStatsRule.getHistoryDir(), getClass().getSimpleName()), + mStatsRule.getHandler())); } @Test @@ -274,10 +279,7 @@ public class BatteryUsageStatsProviderTest { powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, true); - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, - powerAttributor, mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock, - mMonotonicClock); + BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0); return provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT); } @@ -331,30 +333,30 @@ public class BatteryUsageStatsProviderTest { BatteryStats.HistoryItem item; assertThat(item = iterator.next()).isNotNull(); - assertHistoryItem(item, + assertHistoryItem(batteryStats, item, BatteryStats.HistoryItem.CMD_RESET, BatteryStats.HistoryItem.EVENT_NONE, null, 0, 3_600_000, 90, 1_000_000); assertThat(item = iterator.next()).isNotNull(); - assertHistoryItem(item, + assertHistoryItem(batteryStats, item, BatteryStats.HistoryItem.CMD_UPDATE, BatteryStats.HistoryItem.EVENT_NONE, null, 0, 3_600_000, 90, 1_000_000); assertThat(item.states & BatteryStats.HistoryItem.STATE_CPU_RUNNING_FLAG).isNotEqualTo(0); assertThat(item = iterator.next()).isNotNull(); - assertHistoryItem(item, + assertHistoryItem(batteryStats, item, BatteryStats.HistoryItem.CMD_UPDATE, BatteryStats.HistoryItem.EVENT_NONE, null, 0, 3_600_000, 90, 2_000_000); assertThat(item.states & BatteryStats.HistoryItem.STATE_CPU_RUNNING_FLAG).isEqualTo(0); assertThat(item = iterator.next()).isNotNull(); - assertHistoryItem(item, + assertHistoryItem(batteryStats, item, BatteryStats.HistoryItem.CMD_UPDATE, BatteryStats.HistoryItem.EVENT_ALARM | BatteryStats.HistoryItem.EVENT_FLAG_START, "foo", APP_UID, 3_600_000, 90, 3_000_000); assertThat(item = iterator.next()).isNotNull(); - assertHistoryItem(item, + assertHistoryItem(batteryStats, item, BatteryStats.HistoryItem.CMD_UPDATE, BatteryStats.HistoryItem.EVENT_ALARM | BatteryStats.HistoryItem.EVENT_FLAG_FINISH, "foo", APP_UID, 3_600_000, 90, 3_001_000); @@ -441,14 +443,15 @@ public class BatteryUsageStatsProviderTest { assertThat(item.eventTag.string).startsWith(uid + " "); assertThat(item.batteryChargeUah).isEqualTo(3_600_000); assertThat(item.batteryLevel).isEqualTo(90); - assertThat(item.time).isEqualTo((long) 1_000_000); + assertThat(item.time).isEqualTo(batteryStats.getMonotonicStartTime() + 1_000_000); } assertThat(expectedUid).isEqualTo(200); } - private void assertHistoryItem(BatteryStats.HistoryItem item, int command, int eventCode, - String tag, int uid, int batteryChargeUah, int batteryLevel, long elapsedTimeMs) { + private void assertHistoryItem(MockBatteryStatsImpl batteryStats, BatteryStats.HistoryItem item, + int command, int eventCode, String tag, int uid, int batteryChargeUah, int batteryLevel, + long elapsedTimeMs) { assertThat(item.cmd).isEqualTo(command); assertThat(item.eventCode).isEqualTo(eventCode); if (tag == null) { @@ -460,7 +463,7 @@ public class BatteryUsageStatsProviderTest { assertThat(item.batteryChargeUah).isEqualTo(batteryChargeUah); assertThat(item.batteryLevel).isEqualTo(batteryLevel); - assertThat(item.time).isEqualTo(elapsedTimeMs); + assertThat(item.time).isEqualTo(batteryStats.getMonotonicStartTime() + elapsedTimeMs); } @Test @@ -566,38 +569,66 @@ public class BatteryUsageStatsProviderTest { assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS); assertThat(stats.getStatsEndTimestamp()).isEqualTo(55 * MINUTE_IN_MS); - assertThat(stats.getAggregateBatteryConsumer( - BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) - .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) - .isWithin(0.0001) - .of(180.0); // 360 mA * 0.5 hours - assertThat(stats.getAggregateBatteryConsumer( - BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) - .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) - .isEqualTo((10 + 20) * MINUTE_IN_MS); - final UidBatteryConsumer uidBatteryConsumer = stats.getUidBatteryConsumers().stream() - .filter(uid -> uid.getUid() == APP_UID).findFirst().get(); - assertThat(uidBatteryConsumer - .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) - .isWithin(0.1) - .of(180.0); + assertBatteryConsumer(stats, 180.0, (10 + 20) * MINUTE_IN_MS); + assertBatteryConsumer(stats, APP_UID, 180.0, (10 + 20) * MINUTE_IN_MS); stats.close(); } @Test public void accumulateBatteryUsageStats() throws Throwable { - accumulateBatteryUsageStats(10000000, 1); + MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); + accumulateBatteryUsageStats(batteryStats, 10000000, 0); // Accumulate every 200 bytes of battery history - accumulateBatteryUsageStats(200, 2); - accumulateBatteryUsageStats(50, 5); + accumulateBatteryUsageStats(batteryStats, 200, 2); + accumulateBatteryUsageStats(batteryStats, 50, 4); // Accumulate on every invocation of accumulateBatteryUsageStats - accumulateBatteryUsageStats(0, 7); + accumulateBatteryUsageStats(batteryStats, 0, 7); } - private void accumulateBatteryUsageStats(int accumulatedBatteryUsageStatsSpanSize, - int expectedNumberOfUpdates) throws Throwable { - BatteryStatsImpl batteryStats = spy(mStatsRule.getBatteryStats()); + @Test + public void getAccumulatedBatteryUsageStats() throws Throwable { + MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); + + // Only accumulate the first 25 minutes + accumulateBatteryUsageStats(batteryStats, 200, 1); + + BatteryUsageStatsProvider batteryUsageStatsProvider = createBatteryUsageStatsProvider(200); + + // At this point the last stored accumulated stats are `115 - 30 = 85` minutes old + BatteryUsageStats stats = batteryUsageStatsProvider.getBatteryUsageStats(batteryStats, + new BatteryUsageStatsQuery.Builder() + .accumulated() + .setMaxStatsAgeMs(90 * MINUTE_IN_MS) + .build()); + + assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS); + assertThat(stats.getStatsEndTimestamp()).isEqualTo(30 * MINUTE_IN_MS); + assertBatteryConsumer(stats, 60.0, 10 * MINUTE_IN_MS); + assertBatteryConsumer(stats, APP_UID, 60.0, 10 * MINUTE_IN_MS); + + stats.close(); + + // Now force the usage stats to catch up to the current time + stats = batteryUsageStatsProvider.getBatteryUsageStats(batteryStats, + new BatteryUsageStatsQuery.Builder() + .accumulated() + .setMaxStatsAgeMs(5 * MINUTE_IN_MS) + .build()); + + assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS); + assertThat(stats.getStatsEndTimestamp()).isEqualTo(115 * MINUTE_IN_MS); + assertBatteryConsumer(stats, 360.0, 60 * MINUTE_IN_MS); + assertBatteryConsumer(stats, APP_UID, 360.0, 60 * MINUTE_IN_MS); + + stats.close(); + } + + private void accumulateBatteryUsageStats(MockBatteryStatsImpl batteryStatsImpl, + int accumulatedBatteryUsageStatsSpanSize, int expectedNumberOfUpdates) + throws Throwable { + Handler handler = mStatsRule.getHandler(); + MockBatteryStatsImpl batteryStats = spy(batteryStatsImpl); // Note - these two are in microseconds when(batteryStats.computeBatteryTimeRemaining(anyLong())).thenReturn(111_000L); when(batteryStats.computeChargeTimeRemaining(anyLong())).thenReturn(777_000L); @@ -610,82 +641,76 @@ public class BatteryUsageStatsProviderTest { batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); } - PowerStatsStore powerStatsStore = spy(new PowerStatsStore( - new File(mStatsRule.getHistoryDir(), getClass().getSimpleName()), - mStatsRule.getHandler())); - powerStatsStore.reset(); + mPowerStatsStore.reset(); int[] count = new int[1]; doAnswer(inv -> { count[0]++; - return null; - }).when(powerStatsStore).storePowerStatsSpan(any(PowerStatsSpan.class)); + return inv.callRealMethod(); + }).when(mPowerStatsStore).storePowerStatsSpan(any(PowerStatsSpan.class)); - MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext, - powerStatsStore, mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), - () -> 3500); - for (int powerComponentId = 0; powerComponentId < BatteryConsumer.POWER_COMPONENT_COUNT; - powerComponentId++) { - powerAttributor.setPowerComponentSupported(powerComponentId, true); - } - powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_ANY, true); - - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, - powerAttributor, mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), powerStatsStore, - accumulatedBatteryUsageStatsSpanSize, mMockClock, mMonotonicClock); + BatteryUsageStatsProvider batteryUsageStatsProvider = createBatteryUsageStatsProvider( + accumulatedBatteryUsageStatsSpanSize); - provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler()); + batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler); + setTime(10 * MINUTE_IN_MS); synchronized (batteryStats) { batteryStats.noteFlashlightOnLocked(APP_UID, 10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); } - provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler()); + batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler); + setTime(20 * MINUTE_IN_MS); synchronized (batteryStats) { batteryStats.noteFlashlightOffLocked(APP_UID, 20 * MINUTE_IN_MS, 20 * MINUTE_IN_MS); } - provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler()); + batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler); + setTime(30 * MINUTE_IN_MS); synchronized (batteryStats) { batteryStats.noteFlashlightOnLocked(APP_UID, 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); } - provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler()); + batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler); + // Make sure the accumulated stats are computed and saved before generating more history + mStatsRule.waitForBackgroundThread(); + + setTime(50 * MINUTE_IN_MS); synchronized (batteryStats) { batteryStats.noteFlashlightOffLocked(APP_UID, 50 * MINUTE_IN_MS, 50 * MINUTE_IN_MS); } setTime(55 * MINUTE_IN_MS); - provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler()); + batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler); // This section has not been saved yet, but should be added to the accumulated totals + setTime(80 * MINUTE_IN_MS); synchronized (batteryStats) { batteryStats.noteFlashlightOnLocked(APP_UID, 80 * MINUTE_IN_MS, 80 * MINUTE_IN_MS); } - provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler()); + batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler); + setTime(110 * MINUTE_IN_MS); synchronized (batteryStats) { batteryStats.noteFlashlightOffLocked(APP_UID, 110 * MINUTE_IN_MS, 110 * MINUTE_IN_MS); } setTime(115 * MINUTE_IN_MS); - // Pick up the remainder of battery history that has not yet been accumulated - provider.accumulateBatteryUsageStats(batteryStats); + batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler); mStatsRule.waitForBackgroundThread(); - BatteryUsageStats stats = provider.getBatteryUsageStats(batteryStats, + BatteryUsageStats stats = batteryUsageStatsProvider.getBatteryUsageStats(batteryStats, new BatteryUsageStatsQuery.Builder().accumulated().build()); assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS); @@ -696,29 +721,55 @@ public class BatteryUsageStatsProviderTest { assertThat(stats.getBatteryCapacity()).isEqualTo(4000); // from PowerProfile // Total: 10 + 20 + 30 = 60 - assertThat(stats.getAggregateBatteryConsumer( - BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + assertBatteryConsumer(stats, 360.0, 60 * MINUTE_IN_MS); + assertBatteryConsumer(stats, APP_UID, 360.0, 60 * MINUTE_IN_MS); + stats.close(); + + mStatsRule.waitForBackgroundThread(); + + assertThat(count[0]).isEqualTo(expectedNumberOfUpdates); + } + + private BatteryUsageStatsProvider createBatteryUsageStatsProvider( + int accumulatedBatteryUsageStatsSpanSize) { + MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext, + mPowerStatsStore, mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), + () -> 3500); + for (int powerComponentId = 0; powerComponentId < BatteryConsumer.POWER_COMPONENT_COUNT; + powerComponentId++) { + powerAttributor.setPowerComponentSupported(powerComponentId, true); + } + powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_ANY, true); + + return new BatteryUsageStatsProvider(mContext, powerAttributor, + mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), mPowerStatsStore, + accumulatedBatteryUsageStatsSpanSize, mMockClock, mMonotonicClock); + } + + private static void assertBatteryConsumer(BatteryUsageStats stats, double expectedPowerMah, + long expectedDurationMs) { + AggregateBatteryConsumer aggregatedConsumer = stats.getAggregateBatteryConsumer( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE); + assertThat(aggregatedConsumer .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) .isWithin(0.0001) - .of(360.0); // 360 mA * 1.0 hour - assertThat(stats.getAggregateBatteryConsumer( - BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .of(expectedPowerMah); + assertThat(aggregatedConsumer .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) - .isEqualTo(60 * MINUTE_IN_MS); + .isEqualTo(expectedDurationMs); + } + private static void assertBatteryConsumer(BatteryUsageStats stats, int uid, + double expectedPowerMah, long expectedDurationMs) { final UidBatteryConsumer uidBatteryConsumer = stats.getUidBatteryConsumers().stream() - .filter(uid -> uid.getUid() == APP_UID).findFirst().get(); + .filter(u -> u.getUid() == uid).findFirst().get(); assertThat(uidBatteryConsumer .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) .isWithin(0.1) - .of(360.0); + .of(expectedPowerMah); assertThat(uidBatteryConsumer .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) - .isEqualTo(60 * MINUTE_IN_MS); - - assertThat(count[0]).isEqualTo(expectedNumberOfUpdates); - - stats.close(); + .isEqualTo(expectedDurationMs); } private void setTime(long timeMs) { diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java index a3c7ece386c7..9e7e0b646047 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java @@ -41,6 +41,7 @@ import android.util.SparseArray; import android.util.Xml; import com.android.internal.os.CpuScalingPolicies; +import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.power.EnergyConsumerStats; @@ -65,6 +66,7 @@ public class BatteryUsageStatsRule implements TestRule { private final PowerProfile mPowerProfile; private final MockClock mMockClock = new MockClock(); + private final MonotonicClock mMonotonicClock = new MonotonicClock(666777, mMockClock); private String mTestName; private boolean mCreateTempDirectory; private File mHistoryDir; @@ -118,7 +120,7 @@ public class BatteryUsageStatsRule implements TestRule { clearDirectory(); } mBatteryStats = new MockBatteryStatsImpl(mBatteryStatsConfigBuilder.build(), - mMockClock, mHistoryDir, mHandler, new PowerStatsUidResolver()); + mMockClock, mMonotonicClock, mHistoryDir, mHandler, new PowerStatsUidResolver()); mBatteryStats.setPowerProfile(mPowerProfile); mBatteryStats.setCpuScalingPolicies(new CpuScalingPolicies(mCpusByPolicy, mFreqsByPolicy)); synchronized (mBatteryStats) { @@ -144,6 +146,10 @@ public class BatteryUsageStatsRule implements TestRule { return mMockClock; } + public MonotonicClock getMonotonicClock() { + return mMonotonicClock; + } + public Handler getHandler() { return mHandler; } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java index e392c5d190f7..3895cb480847 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java @@ -225,7 +225,10 @@ public class BluetoothPowerStatsCollectorTest { } private PowerStats collectPowerStats() { - BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector); + List<BluetoothActivityEnergyInfo> expected = new ArrayList<>(); + List<BluetoothActivityEnergyInfo> observed = new ArrayList<>(); + BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector, + (info, elapsedRealtimeMs, uptimeMs) -> observed.add(info)); collector.setEnabled(true); when(mConsumedEnergyRetriever.getVoltageMv()).thenReturn(3500); @@ -236,6 +239,7 @@ public class BluetoothPowerStatsCollectorTest { mockUidTraffic(APP_UID1, 100, 200), mockUidTraffic(APP_UID2, 300, 400), mockUidTraffic(ISOLATED_UID, 500, 600)); + expected.add(mBluetoothActivityEnergyInfo); mUidScanTimes.put(APP_UID1, 100); @@ -248,6 +252,7 @@ public class BluetoothPowerStatsCollectorTest { mockUidTraffic(APP_UID1, 1100, 2200), mockUidTraffic(APP_UID2, 3300, 4400), mockUidTraffic(ISOLATED_UID, 5500, 6600)); + expected.add(mBluetoothActivityEnergyInfo); mUidScanTimes.clear(); mUidScanTimes.put(APP_UID1, 200); @@ -257,7 +262,10 @@ public class BluetoothPowerStatsCollectorTest { mockConsumedEnergy(777, 64321); mStatsRule.setTime(20000, 20000); - return collector.collectStats(); + PowerStats powerStats = collector.collectStats(); + + assertThat(observed).isEqualTo(expected); + return powerStats; } private void mockConsumedEnergy(int consumerId, long energyUWs) { diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java index b374a3202fa2..9a38209a7d17 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java @@ -77,9 +77,15 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { new PowerStatsUidResolver()); } - MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory, - Handler handler, PowerStatsUidResolver powerStatsUidResolver) { - super(config, clock, new MonotonicClock(0, clock), historyDirectory, handler, + MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, + File historyDirectory, Handler handler, PowerStatsUidResolver powerStatsUidResolver) { + this(config, clock, new MonotonicClock(0, clock), historyDirectory, handler, + powerStatsUidResolver); + } + + MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, MonotonicClock monotonicClock, + File historyDirectory, Handler handler, PowerStatsUidResolver powerStatsUidResolver) { + super(config, clock, monotonicClock, historyDirectory, handler, mock(PlatformIdleStateCallback.class), mock(EnergyStatsRetriever.class), mock(UserInfoProvider.class), mockPowerProfile(), new CpuScalingPolicies(new SparseArray<>(), new SparseArray<>()), diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java index 2c580e5ab0d2..60131861ce89 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java @@ -170,7 +170,7 @@ public class BluetoothPowerStatsProcessorTest { PowerComponentAggregatedPowerStats aggregatedStats = createAggregatedPowerStats( () -> new BluetoothPowerStatsProcessor(mStatsRule.getPowerProfile())); - BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector); + BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector, null); collector.setEnabled(true); mBluetoothActivityEnergyInfo = mockBluetoothActivityEnergyInfo(1000, 600, 100, 200, mockUidTraffic(APP_UID1, 100, 200), @@ -271,7 +271,7 @@ public class BluetoothPowerStatsProcessorTest { PowerComponentAggregatedPowerStats aggregatedStats = createAggregatedPowerStats( () -> new BluetoothPowerStatsProcessor(mStatsRule.getPowerProfile())); - BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector); + BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector, null); collector.setEnabled(true); mBluetoothActivityEnergyInfo = mockBluetoothActivityEnergyInfo(1000, 600, 100, 200, mockUidTraffic(APP_UID1, 100, 200), @@ -371,7 +371,7 @@ public class BluetoothPowerStatsProcessorTest { PowerComponentAggregatedPowerStats aggregatedStats = createAggregatedPowerStats( () -> new BluetoothPowerStatsProcessor(mStatsRule.getPowerProfile())); - BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector); + BluetoothPowerStatsCollector collector = new BluetoothPowerStatsCollector(mInjector, null); collector.setEnabled(true); mBluetoothActivityEnergyInfo = mockBluetoothActivityEnergyInfo(1000, 600, 100, 200, mockUidTraffic(APP_UID1, 100, 200), diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java index f312bedca82c..3bdbcb50e601 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java @@ -263,6 +263,34 @@ public class PowerStatsAggregatorTest { }); } + @Test + public void emptyHistory() { + PowerStats.Descriptor descriptor = new PowerStats.Descriptor(TEST_POWER_COMPONENT, + "majorDrain", 1, null, 0, 1, new PersistableBundle()); + PowerStats powerStats = new PowerStats(descriptor); + + mHistory.forceRecordAllHistory(); + + advance(1000); + + long firstItemTimestamp = mMonotonicClock.monotonicTime(); + powerStats.stats = new long[]{24}; + mHistory.recordPowerStats(mClock.realtime, mClock.uptime, powerStats); + + advance(1000); + + long secondItemTimestamp = mMonotonicClock.monotonicTime(); + powerStats.stats = new long[]{42}; + mHistory.recordPowerStats(mClock.realtime, mClock.uptime, powerStats); + + mAggregator.aggregatePowerStats(mHistory, firstItemTimestamp + 1, secondItemTimestamp, + stats -> { + mAggregatedStatsCount++; + }); + + assertThat(mAggregatedStatsCount).isEqualTo(0); + } + private void advance(long durationMs) { mClock.realtime += durationMs; mClock.uptime += durationMs; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java index 38fe6134d992..d243f92a139f 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java @@ -408,7 +408,7 @@ public class PowerStatsExporterTest { BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder( new String[]{"cu570m"}, /* includeProcessStateData */ true, true, true, /* powerThreshold */ 0); - exportAggregatedPowerStats(builder, 3700, 6700); + exportAggregatedPowerStats(builder, 3700, 7500); BatteryUsageStats actual = builder.build(); String message = "Actual BatteryUsageStats: " + actual; diff --git a/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java b/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java index 9850cb09ae2b..8024915692aa 100644 --- a/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java @@ -16,12 +16,7 @@ package com.android.server; -import static android.service.quickaccesswallet.Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP; -import static android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap; - -import static com.android.server.GestureLauncherService.LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER; -import static com.android.server.GestureLauncherService.LAUNCH_WALLET_ON_DOUBLE_TAP_POWER; -import static com.android.server.GestureLauncherService.POWER_DOUBLE_TAP_MAX_TIME_MS; +import static com.android.server.GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -29,27 +24,19 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.PendingIntent; import android.app.StatusBarManager; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.res.Resources; import android.os.Looper; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; -import android.platform.test.annotations.RequiresFlagsEnabled; -import android.platform.test.flag.junit.CheckFlagsRule; -import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; -import android.service.quickaccesswallet.QuickAccessWalletClient; import android.telecom.TelecomManager; import android.test.mock.MockContentResolver; import android.testing.TestableLooper; @@ -68,7 +55,6 @@ import com.android.server.statusbar.StatusBarManagerInternal; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -76,8 +62,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; /** * Unit tests for {@link GestureLauncherService}. @@ -106,32 +90,9 @@ public class GestureLauncherServiceTest { private @Mock TelecomManager mTelecomManager; private @Mock MetricsLogger mMetricsLogger; @Mock private UiEventLogger mUiEventLogger; - @Mock private QuickAccessWalletClient mQuickAccessWalletClient; private MockContentResolver mContentResolver; private GestureLauncherService mGestureLauncherService; - private Context mInstrumentationContext = - InstrumentationRegistry.getInstrumentation().getContext(); - - private static final String LAUNCH_TEST_WALLET_ACTION = "LAUNCH_TEST_WALLET_ACTION"; - private static final String LAUNCH_FALLBACK_ACTION = "LAUNCH_FALLBACK_ACTION"; - private PendingIntent mGesturePendingIntent = - PendingIntent.getBroadcast( - mInstrumentationContext, - 0, - new Intent(LAUNCH_TEST_WALLET_ACTION), - PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT); - - private PendingIntent mFallbackPendingIntent = - PendingIntent.getBroadcast( - mInstrumentationContext, - 0, - new Intent(LAUNCH_FALLBACK_ACTION), - PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT); - - @Rule - public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); - @BeforeClass public static void oneTimeInitialization() { if (Looper.myLooper() == null) { @@ -154,49 +115,9 @@ public class GestureLauncherServiceTest { when(mContext.getContentResolver()).thenReturn(mContentResolver); when(mContext.getSystemService(Context.TELECOM_SERVICE)).thenReturn(mTelecomManager); when(mTelecomManager.createLaunchEmergencyDialerIntent(null)).thenReturn(new Intent()); - when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true); - - mGestureLauncherService = - new GestureLauncherService( - mContext, mMetricsLogger, mQuickAccessWalletClient, mUiEventLogger); - - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER); - } - private WalletLaunchedReceiver registerWalletLaunchedReceiver(String action) { - IntentFilter filter = new IntentFilter(action); - WalletLaunchedReceiver receiver = new WalletLaunchedReceiver(); - mInstrumentationContext.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED); - return receiver; - } - - /** - * A simple {@link BroadcastReceiver} implementation that counts down a {@link CountDownLatch} - * when a matching message is received - */ - private static final class WalletLaunchedReceiver extends BroadcastReceiver { - private static final int TIMEOUT_SECONDS = 3; - - private final CountDownLatch mLatch; - - WalletLaunchedReceiver() { - mLatch = new CountDownLatch(1); - } - - @Override - public void onReceive(Context context, Intent intent) { - mLatch.countDown(); - context.unregisterReceiver(this); - } - - Boolean waitUntilShown() { - try { - return mLatch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS); - } catch (InterruptedException e) { - return false; - } - } + mGestureLauncherService = new GestureLauncherService(mContext, mMetricsLogger, + mUiEventLogger); } @Test @@ -213,123 +134,37 @@ public class GestureLauncherServiceTest { @Test public void testIsCameraDoubleTapPowerSettingEnabled_configFalseSettingDisabled() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerEnabledConfigValue(false); - withDoubleTapPowerGestureEnableSettingValue(false); - withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER); - } else { - withCameraDoubleTapPowerEnableConfigValue(false); - withCameraDoubleTapPowerDisableSettingValue(1); - } + withCameraDoubleTapPowerEnableConfigValue(false); + withCameraDoubleTapPowerDisableSettingValue(1); assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled( mContext, FAKE_USER_ID)); } @Test public void testIsCameraDoubleTapPowerSettingEnabled_configFalseSettingEnabled() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerEnabledConfigValue(false); - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER); - assertTrue(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled( - mContext, FAKE_USER_ID)); - } else { - withCameraDoubleTapPowerEnableConfigValue(false); - withCameraDoubleTapPowerDisableSettingValue(0); - assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled( - mContext, FAKE_USER_ID)); - } + withCameraDoubleTapPowerEnableConfigValue(false); + withCameraDoubleTapPowerDisableSettingValue(0); + assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled( + mContext, FAKE_USER_ID)); } @Test public void testIsCameraDoubleTapPowerSettingEnabled_configTrueSettingDisabled() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerEnabledConfigValue(true); - withDoubleTapPowerGestureEnableSettingValue(false); - withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER); - } else { - withCameraDoubleTapPowerEnableConfigValue(true); - withCameraDoubleTapPowerDisableSettingValue(1); - } + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(1); assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled( mContext, FAKE_USER_ID)); } @Test public void testIsCameraDoubleTapPowerSettingEnabled_configTrueSettingEnabled() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerEnabledConfigValue(true); - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER); - } else { - withCameraDoubleTapPowerEnableConfigValue(true); - withCameraDoubleTapPowerDisableSettingValue(0); - } + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); assertTrue(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled( mContext, FAKE_USER_ID)); } @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testIsCameraDoubleTapPowerSettingEnabled_actionWallet() { - withDoubleTapPowerEnabledConfigValue(true); - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER); - - assertFalse( - mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled( - mContext, FAKE_USER_ID)); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testIsWalletDoubleTapPowerSettingEnabled() { - withDoubleTapPowerEnabledConfigValue(true); - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER); - - assertTrue( - mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled( - mContext, FAKE_USER_ID)); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testIsWalletDoubleTapPowerSettingEnabled_configDisabled() { - withDoubleTapPowerEnabledConfigValue(false); - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER); - - assertTrue( - mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled( - mContext, FAKE_USER_ID)); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testIsWalletDoubleTapPowerSettingEnabled_settingDisabled() { - withDoubleTapPowerEnabledConfigValue(true); - withDoubleTapPowerGestureEnableSettingValue(false); - withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER); - - assertFalse( - mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled( - mContext, FAKE_USER_ID)); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testIsWalletDoubleTapPowerSettingEnabled_actionCamera() { - withDoubleTapPowerEnabledConfigValue(true); - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER); - - assertFalse( - mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled( - mContext, FAKE_USER_ID)); - } - - @Test public void testIsEmergencyGestureSettingEnabled_settingDisabled() { withEmergencyGestureEnabledConfigValue(true); withEmergencyGestureEnabledSettingValue(false); @@ -410,9 +245,12 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_firstPowerDownCameraPowerGestureOnInteractive() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); - long eventTime = INITIAL_EVENT_TIME_MILLIS + POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + long eventTime = INITIAL_EVENT_TIME_MILLIS + + CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); boolean interactive = true; @@ -446,12 +284,8 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOffInteractive() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerGestureEnableSettingValue(false); - } else { - withCameraDoubleTapPowerEnableConfigValue(false); - withCameraDoubleTapPowerDisableSettingValue(1); - } + withCameraDoubleTapPowerEnableConfigValue(false); + withCameraDoubleTapPowerDisableSettingValue(1); mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); long eventTime = INITIAL_EVENT_TIME_MILLIS; @@ -464,7 +298,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -495,12 +329,8 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalMidBoundsCameraPowerGestureOffInteractive() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerGestureEnableSettingValue(false); - } else { - withCameraDoubleTapPowerEnableConfigValue(false); - withCameraDoubleTapPowerDisableSettingValue(1); - } + withCameraDoubleTapPowerEnableConfigValue(false); + withCameraDoubleTapPowerDisableSettingValue(1); mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); long eventTime = INITIAL_EVENT_TIME_MILLIS; @@ -513,7 +343,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -592,7 +422,10 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupComplete() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); + withUserSetupCompleteValue(true); long eventTime = INITIAL_EVENT_TIME_MILLIS; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, @@ -604,7 +437,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -637,145 +470,15 @@ public class GestureLauncherServiceTest { } @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void - testInterceptPowerKeyDown_fiveInboundPresses_walletAndEmergencyEnabled_bothLaunch() { - WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION); - setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent); - enableEmergencyGesture(); - enableWalletGesture(); - - // First event - long eventTime = INITIAL_EVENT_TIME_MILLIS; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true); - - assertTrue(receiver.waitUntilShown()); - - // Presses 3 and 4 should not trigger any gesture - for (int i = 0; i < 2; i++) { - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, false); - } - - // Fifth button press should trigger the emergency flow - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true); - - verify(mUiEventLogger, times(1)) - .log(GestureLauncherService.GestureLauncherEvent.GESTURE_EMERGENCY_TAP_POWER); - verify(mStatusBarManagerInternal).onEmergencyActionLaunchGestureDetected(); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testInterceptPowerKeyDown_intervalInBoundsWalletPowerGesture() { - WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION); - setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent); - enableWalletGesture(); - enableEmergencyGesture(); - - long eventTime = INITIAL_EVENT_TIME_MILLIS; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true); - assertTrue(receiver.waitUntilShown()); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testInterceptPowerKeyDown_walletGestureOn_quickAccessWalletServiceUnavailable() { - when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false); - WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION); - setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent); - enableWalletGesture(); - - // First event - long eventTime = INITIAL_EVENT_TIME_MILLIS; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, false); - - assertFalse(receiver.waitUntilShown()); - } - - @Test - public void testInterceptPowerKeyDown_walletGestureOn_userSetupIncomplete() { - WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION); - setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent); - enableWalletGesture(); - withUserSetupCompleteValue(false); - - // First event - long eventTime = INITIAL_EVENT_TIME_MILLIS; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - assertFalse(receiver.waitUntilShown()); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testInterceptPowerKeyDown_walletPowerGesture_nullPendingIntent() { - WalletLaunchedReceiver gestureReceiver = - registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION); - setUpGetGestureTargetActivityPendingIntent(null); - WalletLaunchedReceiver fallbackReceiver = - registerWalletLaunchedReceiver(LAUNCH_FALLBACK_ACTION); - setUpWalletFallbackPendingIntent(mFallbackPendingIntent); - enableWalletGesture(); - enableEmergencyGesture(); - - // First event - long eventTime = INITIAL_EVENT_TIME_MILLIS; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true); - - assertFalse(gestureReceiver.waitUntilShown()); - assertTrue(fallbackReceiver.waitUntilShown()); - } - - @Test - @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) - public void testInterceptPowerKeyDown_walletPowerGesture_intervalOutOfBounds() { - WalletLaunchedReceiver gestureReceiver = - registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION); - setUpGetGestureTargetActivityPendingIntent(null); - WalletLaunchedReceiver fallbackReceiver = - registerWalletLaunchedReceiver(LAUNCH_FALLBACK_ACTION); - setUpWalletFallbackPendingIntent(mFallbackPendingIntent); - enableWalletGesture(); - enableEmergencyGesture(); - - // First event - long eventTime = INITIAL_EVENT_TIME_MILLIS; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS; - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - assertFalse(gestureReceiver.waitUntilShown()); - assertFalse(fallbackReceiver.waitUntilShown()); - } - - @Test public void testInterceptPowerKeyDown_fiveInboundPresses_cameraAndEmergencyEnabled_bothLaunch() { - enableCameraGesture(); - enableEmergencyGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + withEmergencyGestureEnabledConfigValue(true); + withEmergencyGestureEnabledSettingValue(true); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); + mGestureLauncherService.updateEmergencyGestureEnabled(); + withUserSetupCompleteValue(true); // First button press does nothing long eventTime = INITIAL_EVENT_TIME_MILLIS; @@ -788,7 +491,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; // 2nd button triggers camera eventTime += interval; @@ -877,7 +580,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; // 3 more button presses which should not trigger any gesture (camera gesture disabled) for (int i = 0; i < 3; i++) { eventTime += interval; @@ -931,7 +634,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; // 3 more button presses which should not trigger any gesture, but intercepts action. for (int i = 0; i < 3; i++) { eventTime += interval; @@ -1034,7 +737,7 @@ public class GestureLauncherServiceTest { interactive, outLaunched); assertTrue(intercepted); assertFalse(outLaunched.value); - interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; } } @@ -1062,7 +765,7 @@ public class GestureLauncherServiceTest { interactive, outLaunched); assertTrue(intercepted); assertFalse(outLaunched.value); - interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; } } @@ -1213,7 +916,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT, IGNORED_META_STATE, IGNORED_DEVICE_ID, IGNORED_SCANCODE, @@ -1244,7 +947,9 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupIncomplete() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); withUserSetupCompleteValue(false); long eventTime = INITIAL_EVENT_TIME_MILLIS; @@ -1257,7 +962,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -1290,7 +995,9 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalMidBoundsCameraPowerGestureOnInteractive() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); long eventTime = INITIAL_EVENT_TIME_MILLIS; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, @@ -1302,7 +1009,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -1335,7 +1042,9 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOnInteractive() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); long eventTime = INITIAL_EVENT_TIME_MILLIS; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, @@ -1378,12 +1087,8 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOffNotInteractive() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerGestureEnableSettingValue(false); - } else { - withCameraDoubleTapPowerEnableConfigValue(false); - withCameraDoubleTapPowerDisableSettingValue(1); - } + withCameraDoubleTapPowerEnableConfigValue(false); + withCameraDoubleTapPowerDisableSettingValue(1); mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); long eventTime = INITIAL_EVENT_TIME_MILLIS; @@ -1396,7 +1101,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -1441,7 +1146,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -1518,7 +1223,10 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnNotInteractiveSetupComplete() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); + withUserSetupCompleteValue(true); long eventTime = INITIAL_EVENT_TIME_MILLIS; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, @@ -1530,7 +1238,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -1564,7 +1272,9 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnNotInteractiveSetupIncomplete() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); withUserSetupCompleteValue(false); long eventTime = INITIAL_EVENT_TIME_MILLIS; @@ -1577,7 +1287,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -1622,7 +1332,7 @@ public class GestureLauncherServiceTest { assertFalse(intercepted); assertFalse(outLaunched.value); - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS; + final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS; eventTime += interval; keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); @@ -1655,7 +1365,9 @@ public class GestureLauncherServiceTest { @Test public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOnNotInteractive() { - enableCameraGesture(); + withCameraDoubleTapPowerEnableConfigValue(true); + withCameraDoubleTapPowerDisableSettingValue(0); + mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); long eventTime = INITIAL_EVENT_TIME_MILLIS; KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, @@ -1697,53 +1409,12 @@ public class GestureLauncherServiceTest { } /** - * If processPowerKeyDown is called instead of interceptPowerKeyDown (meaning the double tap - * gesture isn't performed), the emergency gesture is still launched. - */ - @Test - public void - testProcessPowerKeyDown_fiveInboundPresses_cameraDoesNotLaunch_emergencyGestureLaunches() { - enableCameraGesture(); - enableEmergencyGesture(); - - // First event - long eventTime = INITIAL_EVENT_TIME_MILLIS; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false); - - //Second event; call processPowerKeyDown without calling interceptPowerKeyDown - final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1; - eventTime += interval; - KeyEvent keyEvent = - new KeyEvent( - IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); - mGestureLauncherService.processPowerKeyDown(keyEvent); - - verify(mMetricsLogger, never()) - .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt()); - verify(mUiEventLogger, never()).log(any()); - - // Presses 3 and 4 should not trigger any gesture - for (int i = 0; i < 2; i++) { - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, false); - } - - // Fifth button press should still trigger the emergency flow - eventTime += interval; - sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true); - - verify(mUiEventLogger, times(1)) - .log(GestureLauncherService.GestureLauncherEvent.GESTURE_EMERGENCY_TAP_POWER); - verify(mStatusBarManagerInternal).onEmergencyActionLaunchGestureDetected(); - } - - /** * Helper method to trigger emergency gesture by pressing button for 5 times. * * @return last event time. */ private long triggerEmergencyGesture() { - return triggerEmergencyGesture(POWER_DOUBLE_TAP_MAX_TIME_MS - 1); + return triggerEmergencyGesture(CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1); } /** @@ -1802,27 +1473,6 @@ public class GestureLauncherServiceTest { .thenReturn(enableConfigValue); } - private void withDoubleTapPowerEnabledConfigValue(boolean enable) { - when(mResources.getBoolean(com.android.internal.R.bool.config_doubleTapPowerGestureEnabled)) - .thenReturn(enable); - } - - private void withDoubleTapPowerGestureEnableSettingValue(boolean enable) { - Settings.Secure.putIntForUser( - mContentResolver, - Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, - enable ? 1 : 0, - UserHandle.USER_CURRENT); - } - - private void withDefaultDoubleTapPowerGestureAction(int action) { - Settings.Secure.putIntForUser( - mContentResolver, - Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE, - action, - UserHandle.USER_CURRENT); - } - private void withEmergencyGestureEnabledConfigValue(boolean enableConfigValue) { when(mResources.getBoolean( com.android.internal.R.bool.config_emergencyGestureEnabled)) @@ -1860,72 +1510,4 @@ public class GestureLauncherServiceTest { userSetupCompleteValue, UserHandle.USER_CURRENT); } - - private void setUpGetGestureTargetActivityPendingIntent(PendingIntent pendingIntent) { - doAnswer( - invocation -> { - QuickAccessWalletClient.GesturePendingIntentCallback callback = - (QuickAccessWalletClient.GesturePendingIntentCallback) - invocation.getArguments()[1]; - callback.onGesturePendingIntentRetrieved(pendingIntent); - return null; - }) - .when(mQuickAccessWalletClient) - .getGestureTargetActivityPendingIntent(any(), any()); - } - - private void setUpWalletFallbackPendingIntent(PendingIntent pendingIntent) { - doAnswer( - invocation -> { - QuickAccessWalletClient.WalletPendingIntentCallback callback = - (QuickAccessWalletClient.WalletPendingIntentCallback) - invocation.getArguments()[1]; - callback.onWalletPendingIntentRetrieved(pendingIntent); - return null; - }) - .when(mQuickAccessWalletClient) - .getWalletPendingIntent(any(), any()); - } - - private void enableWalletGesture() { - withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER); - withDoubleTapPowerGestureEnableSettingValue(true); - withDoubleTapPowerEnabledConfigValue(true); - - mGestureLauncherService.updateWalletDoubleTapPowerEnabled(); - withUserSetupCompleteValue(true); - } - - private void enableEmergencyGesture() { - withEmergencyGestureEnabledConfigValue(true); - withEmergencyGestureEnabledSettingValue(true); - mGestureLauncherService.updateEmergencyGestureEnabled(); - withUserSetupCompleteValue(true); - } - - private void enableCameraGesture() { - if (launchWalletOptionOnPowerDoubleTap()) { - withDoubleTapPowerEnabledConfigValue(true); - withDoubleTapPowerGestureEnableSettingValue(true); - withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER); - } else { - withCameraDoubleTapPowerEnableConfigValue(true); - withCameraDoubleTapPowerDisableSettingValue(0); - } - mGestureLauncherService.updateCameraDoubleTapPowerEnabled(); - withUserSetupCompleteValue(true); - } - - private void sendPowerKeyDownToGestureLauncherServiceAndAssertValues( - long eventTime, boolean expectedIntercept, boolean expectedOutLaunchedValue) { - KeyEvent keyEvent = - new KeyEvent( - IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT); - boolean interactive = true; - MutableBoolean outLaunched = new MutableBoolean(true); - boolean intercepted = - mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive, outLaunched); - assertEquals(intercepted, expectedIntercept); - assertEquals(outLaunched.value, expectedOutLaunchedValue); - } } diff --git a/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java b/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java index 75258f0aa7e0..d2db999d72ca 100644 --- a/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java @@ -15,6 +15,8 @@ */ package com.android.server.autofill; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED; import static com.google.common.truth.Truth.assertThat; @@ -129,4 +131,57 @@ public class PresentationEventLoggerTest { assertThat(event).isNotNull(); assertThat(event.mDisplayPresentationType).isEqualTo(3); } + + @Test + public void testNoSuggestionsTextFiltered() { + PresentationStatsEventLogger pEventLogger = + PresentationStatsEventLogger.createPresentationLog(1, 1, 1); + AutofillId id = new AutofillId(13); + AutofillValue initialValue = AutofillValue.forText("hello"); + pEventLogger.startNewEvent(); + pEventLogger.maybeSetFocusedId(id); + pEventLogger.maybeSetNoPresentationEventReasonSuggestionsFiltered(initialValue); + + PresentationStatsEventLogger.PresentationStatsEventInternal event = + pEventLogger.getInternalEvent().get(); + assertThat(event).isNotNull(); + int NO_SUGGESTIONS = + AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT; + assertThat(event.mNoPresentationReason).isEqualTo(NO_SUGGESTIONS); + } + + @Test + public void testSuggestionsTextNotFiltered() { + PresentationStatsEventLogger pEventLogger = + PresentationStatsEventLogger.createPresentationLog(1, 1, 1); + AutofillId id = new AutofillId(13); + AutofillValue initialValue = null; + pEventLogger.startNewEvent(); + pEventLogger.maybeSetFocusedId(id); + pEventLogger.maybeSetNoPresentationEventReasonSuggestionsFiltered(initialValue); + + PresentationStatsEventLogger.PresentationStatsEventInternal event = + pEventLogger.getInternalEvent().get(); + assertThat(event).isNotNull(); + assertThat(event.mNoPresentationReason).isNotEqualTo( + AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT); + } + + @Test + public void testNotShownReasonNotOverridden() { + + PresentationStatsEventLogger pEventLogger = + PresentationStatsEventLogger.createPresentationLog(1, 1, 1); + + pEventLogger.startNewEvent(); + pEventLogger.maybeSetNoPresentationEventReason(AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED); + // Not allowed - no op + pEventLogger.maybeSetNoPresentationEventReasonIfNoReasonExists( + AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT); + + PresentationStatsEventLogger.PresentationStatsEventInternal event = + pEventLogger.getInternalEvent().get(); + assertThat(event).isNotNull(); + assertThat(event.mNoPresentationReason).isEqualTo(AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED); + } } diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index a0f2395f5203..d70ffd2ec050 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -159,7 +159,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test for the first launch path, no settings file available. */ - public void testFirstInitialize() { + public void FirstInitialize() { assertResetTimes(START_TIME, START_TIME + INTERVAL); } @@ -167,7 +167,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * Test for {@link ShortcutService#getLastResetTimeLocked()} and * {@link ShortcutService#getNextResetTimeLocked()}. */ - public void testUpdateAndGetNextResetTimeLocked() { + public void UpdateAndGetNextResetTimeLocked() { assertResetTimes(START_TIME, START_TIME + INTERVAL); // Advance clock. @@ -196,7 +196,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test for the restoration from saved file. */ - public void testInitializeFromSavedFile() { + public void InitializeFromSavedFile() { mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50; assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL); @@ -220,7 +220,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Add various broken cases. } - public void testLoadConfig() { + public void LoadConfig() { mService.updateConfigurationLocked( ConfigConstants.KEY_RESET_INTERVAL_SEC + "=123," + ConfigConstants.KEY_MAX_SHORTCUTS + "=4," @@ -261,22 +261,22 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // === Test for app side APIs === /** Test for {@link android.content.pm.ShortcutManager#getMaxShortcutCountForActivity()} */ - public void testGetMaxDynamicShortcutCount() { + public void GetMaxDynamicShortcutCount() { assertEquals(MAX_SHORTCUTS, mManager.getMaxShortcutCountForActivity()); } /** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */ - public void testGetRemainingCallCount() { + public void GetRemainingCallCount() { assertEquals(MAX_UPDATES_PER_INTERVAL, mManager.getRemainingCallCount()); } - public void testGetIconMaxDimensions() { + public void GetIconMaxDimensions() { assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxWidth()); assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxHeight()); } /** Test for {@link android.content.pm.ShortcutManager#getRateLimitResetTime()} */ - public void testGetRateLimitResetTime() { + public void GetRateLimitResetTime() { assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50; @@ -284,7 +284,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(START_TIME + 5 * INTERVAL, mManager.getRateLimitResetTime()); } - public void testSetDynamicShortcuts() { + public void SetDynamicShortcuts() { setCaller(CALLING_PACKAGE_1, USER_0); final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1); @@ -354,7 +354,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testAddDynamicShortcuts() { + public void AddDynamicShortcuts() { setCaller(CALLING_PACKAGE_1, USER_0); final ShortcutInfo si1 = makeShortcut("shortcut1"); @@ -402,7 +402,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPushDynamicShortcut() { + public void PushDynamicShortcut() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=5," + ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=1"); @@ -543,7 +543,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { eq(CALLING_PACKAGE_1), eq("s9"), eq(USER_0)); } - public void testPushDynamicShortcut_CallsToUsageStatsManagerAreThrottled() + public void PushDynamicShortcut_CallsToUsageStatsManagerAreThrottled() throws InterruptedException { mService.updateConfigurationLocked( ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=500"); @@ -594,7 +594,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { eq(CALLING_PACKAGE_2), any(), eq(USER_0)); } - public void testUnlimitedCalls() { + public void UnlimitedCalls() { setCaller(CALLING_PACKAGE_1, USER_0); final ShortcutInfo si1 = makeShortcut("shortcut1"); @@ -625,7 +625,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(3, mManager.getRemainingCallCount()); } - public void testPublishWithNoActivity() { + public void PublishWithNoActivity() { // If activity is not explicitly set, use the default one. mRunningUsers.put(USER_10, true); @@ -731,7 +731,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPublishWithNoActivity_noMainActivityInPackage() { + public void PublishWithNoActivity_noMainActivityInPackage() { mRunningUsers.put(USER_10, true); runWithCaller(CALLING_PACKAGE_2, USER_10, () -> { @@ -750,7 +750,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testDeleteDynamicShortcuts() { + public void DeleteDynamicShortcuts() { final ShortcutInfo si1 = makeShortcut("shortcut1"); final ShortcutInfo si2 = makeShortcut("shortcut2"); final ShortcutInfo si3 = makeShortcut("shortcut3"); @@ -791,7 +791,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(2, mManager.getRemainingCallCount()); } - public void testDeleteAllDynamicShortcuts() { + public void DeleteAllDynamicShortcuts() { final ShortcutInfo si1 = makeShortcut("shortcut1"); final ShortcutInfo si2 = makeShortcut("shortcut2"); final ShortcutInfo si3 = makeShortcut("shortcut3"); @@ -820,7 +820,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(1, mManager.getRemainingCallCount()); } - public void testIcons() throws IOException { + public void Icons() throws IOException { final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32); final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64); final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512); @@ -1034,7 +1034,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { */ } - public void testCleanupDanglingBitmaps() throws Exception { + public void CleanupDanglingBitmaps() throws Exception { assertBitmapDirectories(USER_0, EMPTY_STRINGS); assertBitmapDirectories(USER_10, EMPTY_STRINGS); @@ -1203,7 +1203,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { maxSize)); } - public void testShrinkBitmap() { + public void ShrinkBitmap() { checkShrinkBitmap(32, 32, R.drawable.black_512x512, 32); checkShrinkBitmap(511, 511, R.drawable.black_512x512, 511); checkShrinkBitmap(512, 512, R.drawable.black_512x512, 512); @@ -1226,7 +1226,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { return out.getFile(); } - public void testOpenIconFileForWrite() throws IOException { + public void OpenIconFileForWrite() throws IOException { mInjectedCurrentTimeMillis = 1000; final File p10_1_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1); @@ -1300,7 +1300,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertFalse(p11_1_3.getName().contains("_")); } - public void testUpdateShortcuts() { + public void UpdateShortcuts() { runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s1"), @@ -1431,7 +1431,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testUpdateShortcuts_icons() { + public void UpdateShortcuts_icons() { runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s1") @@ -1525,7 +1525,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testShortcutManagerGetShortcuts_shortcutTypes() { + public void ShortcutManagerGetShortcuts_shortcutTypes() { // Create 3 manifest and 3 dynamic shortcuts addManifestShortcutResource( @@ -1616,7 +1616,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), "s1", "s2"); } - public void testCachedShortcuts() { + public void CachedShortcuts() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"), makeLongLivedShortcut("s2"), makeLongLivedShortcut("s3"), @@ -1700,7 +1700,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { "s2"); } - public void testCachedShortcuts_accessShortcutsPermission() { + public void CachedShortcuts_accessShortcutsPermission() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"), makeLongLivedShortcut("s2"), makeLongLivedShortcut("s3"), @@ -1742,7 +1742,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), "s3"); } - public void testCachedShortcuts_canPassShortcutLimit() { + public void CachedShortcuts_canPassShortcutLimit() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=4"); @@ -1780,7 +1780,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // === Test for launcher side APIs === - public void testGetShortcuts() { + public void GetShortcuts() { // Set up shortcuts. @@ -1997,7 +1997,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { "s1", "s3"); } - public void testGetShortcuts_shortcutKinds() throws Exception { + public void GetShortcuts_shortcutKinds() throws Exception { // Create 3 manifest and 3 dynamic shortcuts addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -2108,7 +2108,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testGetShortcuts_resolveStrings() throws Exception { + public void GetShortcuts_resolveStrings() throws Exception { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { ShortcutInfo si = new ShortcutInfo.Builder(mClientContext) .setId("id") @@ -2156,7 +2156,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testGetShortcuts_personsFlag() { + public void GetShortcuts_personsFlag() { ShortcutInfo s = new ShortcutInfo.Builder(mClientContext, "id") .setShortLabel("label") .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class)) @@ -2204,7 +2204,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } // TODO resource - public void testGetShortcutInfo() { + public void GetShortcutInfo() { // Create shortcuts. setCaller(CALLING_PACKAGE_1); final ShortcutInfo s1_1 = makeShortcut( @@ -2279,7 +2279,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals("ABC", findById(list, "s1").getTitle()); } - public void testPinShortcutAndGetPinnedShortcuts() { + public void PinShortcutAndGetPinnedShortcuts() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000); final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000); @@ -2360,7 +2360,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * This is similar to the above test, except it used "disable" instead of "remove". It also * does "enable". */ - public void testDisableAndEnableShortcuts() { + public void DisableAndEnableShortcuts() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000); final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000); @@ -2485,7 +2485,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testDisableShortcuts_thenRepublish() { + public void DisableShortcuts_thenRepublish() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3")))); @@ -2555,7 +2555,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinShortcutAndGetPinnedShortcuts_multi() { + public void PinShortcutAndGetPinnedShortcuts_multi() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -2831,7 +2831,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinShortcutAndGetPinnedShortcuts_assistant() { + public void PinShortcutAndGetPinnedShortcuts_assistant() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -2887,7 +2887,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() { + public void PinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -3476,7 +3476,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testStartShortcut() { + public void StartShortcut() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { final ShortcutInfo s1_1 = makeShortcut( @@ -3611,7 +3611,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Check extra, etc } - public void testLauncherCallback() throws Throwable { + public void LauncherCallback() throws Throwable { // Disable throttling for this test. mService.updateConfigurationLocked( ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=99999999," @@ -3777,7 +3777,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { .isEmpty(); } - public void testLauncherCallback_crossProfile() throws Throwable { + public void LauncherCallback_crossProfile() throws Throwable { prepareCrossProfileDataSet(); final Handler h = new Handler(Looper.getMainLooper()); @@ -3900,7 +3900,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // === Test for persisting === - public void testSaveAndLoadUser_empty() { + public void SaveAndLoadUser_empty() { assertTrue(mManager.setDynamicShortcuts(list())); Log.i(TAG, "Saved state"); @@ -3917,7 +3917,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Try save and load, also stop/start the user. */ - public void testSaveAndLoadUser() { + public void SaveAndLoadUser() { // First, create some shortcuts and save. runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16); @@ -4058,7 +4058,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Check all other fields } - public void testLoadCorruptedShortcuts() throws Exception { + public void LoadCorruptedShortcuts() throws Exception { initService(); addPackage("com.android.chrome", 0, 0); @@ -4072,7 +4072,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertNull(ShortcutPackage.loadFromFile(mService, user, corruptedShortcutPackage, false)); } - public void testSaveCorruptAndLoadUser() throws Exception { + public void SaveCorruptAndLoadUser() throws Exception { // First, create some shortcuts and save. runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16); @@ -4228,7 +4228,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Check all other fields } - public void testCleanupPackage() { + public void CleanupPackage() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s0_1")))); @@ -4505,7 +4505,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mService.saveDirtyInfo(); } - public void testCleanupPackage_republishManifests() { + public void CleanupPackage_republishManifests() { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_2); @@ -4573,7 +4573,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandleGonePackage_crossProfile() { + public void HandleGonePackage_crossProfile() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -4845,7 +4845,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(expected, spi.canRestoreTo(mService, pi, true)); } - public void testCanRestoreTo() { + public void CanRestoreTo() { addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sig1"); addPackage(CALLING_PACKAGE_2, CALLING_UID_2, 10, "sig1", "sig2"); addPackage(CALLING_PACKAGE_3, CALLING_UID_3, 10, "sig1"); @@ -4908,7 +4908,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkCanRestoreTo(DISABLED_REASON_BACKUP_NOT_SUPPORTED, spi3, true, 10, true, "sig1"); } - public void testHandlePackageDelete() { + public void HandlePackageDelete() { checkHandlePackageDeleteInner((userId, packageName) -> { uninstallPackage(userId, packageName); mService.mPackageMonitor.onReceive(getTestContext(), @@ -4916,7 +4916,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageDisable() { + public void HandlePackageDisable() { checkHandlePackageDeleteInner((userId, packageName) -> { disablePackage(userId, packageName); mService.mPackageMonitor.onReceive(getTestContext(), @@ -5048,7 +5048,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } /** Almost ame as testHandlePackageDelete, except it doesn't uninstall packages. */ - public void testHandlePackageClearData() { + public void HandlePackageClearData() { final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource( getTestContext().getResources(), R.drawable.black_32x32)); setCaller(CALLING_PACKAGE_1, USER_0); @@ -5124,7 +5124,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10)); } - public void testHandlePackageClearData_manifestRepublished() { + public void HandlePackageClearData_manifestRepublished() { mRunningUsers.put(USER_10, true); @@ -5166,7 +5166,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageUpdate() throws Throwable { + public void HandlePackageUpdate() throws Throwable { // Set up shortcuts and launchers. final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32); @@ -5340,7 +5340,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test the case where an updated app has resource IDs changed. */ - public void testHandlePackageUpdate_resIdChanged() throws Exception { + public void HandlePackageUpdate_resIdChanged() throws Exception { final Icon icon1 = Icon.createWithResource(getTestContext(), /* res ID */ 1000); final Icon icon2 = Icon.createWithResource(getTestContext(), /* res ID */ 1001); @@ -5415,7 +5415,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageUpdate_systemAppUpdate() { + public void HandlePackageUpdate_systemAppUpdate() { // Package1 is a system app. Package 2 is not a system app, so it's not scanned // in this test at all. @@ -5521,7 +5521,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint()); } - public void testHandlePackageChanged() { + public void HandlePackageChanged() { final ComponentName ACTIVITY1 = new ComponentName(CALLING_PACKAGE_1, "act1"); final ComponentName ACTIVITY2 = new ComponentName(CALLING_PACKAGE_1, "act2"); @@ -5651,7 +5651,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageUpdate_activityNoLongerMain() throws Throwable { + public void HandlePackageUpdate_activityNoLongerMain() throws Throwable { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcutWithActivity("s1a", @@ -5737,7 +5737,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * - Unpinned dynamic shortcuts * - Bitmaps */ - public void testBackupAndRestore() { + public void BackupAndRestore() { assertFileNotExists("user-0/shortcut_dump/restore-0-start.txt"); assertFileNotExists("user-0/shortcut_dump/restore-1-payload.xml"); @@ -5758,7 +5758,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ true); } - public void testBackupAndRestore_backupRestoreTwice() { + public void BackupAndRestore_backupRestoreTwice() { prepareForBackupTest(); checkBackupAndRestore_success(/*firstRestore=*/ true); @@ -5774,7 +5774,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ false); } - public void testBackupAndRestore_restoreToNewVersion() { + public void BackupAndRestore_restoreToNewVersion() { prepareForBackupTest(); addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 2); @@ -5783,7 +5783,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ true); } - public void testBackupAndRestore_restoreToSuperSetSignatures() { + public void BackupAndRestore_restoreToSuperSetSignatures() { prepareForBackupTest(); // Change package signatures. @@ -5980,7 +5980,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_publisherWrongSignature() { + public void BackupAndRestore_publisherWrongSignature() { prepareForBackupTest(); addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sigx"); // different signature @@ -5988,7 +5988,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_publisherNotRestored(ShortcutInfo.DISABLED_REASON_SIGNATURE_MISMATCH); } - public void testBackupAndRestore_publisherNoLongerBackupTarget() { + public void BackupAndRestore_publisherNoLongerBackupTarget() { prepareForBackupTest(); updatePackageInfo(CALLING_PACKAGE_1, @@ -6117,7 +6117,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_launcherLowerVersion() { + public void BackupAndRestore_launcherLowerVersion() { prepareForBackupTest(); addPackage(LAUNCHER_1, LAUNCHER_UID_1, 0); // Lower version @@ -6126,7 +6126,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ true); } - public void testBackupAndRestore_launcherWrongSignature() { + public void BackupAndRestore_launcherWrongSignature() { prepareForBackupTest(); addPackage(LAUNCHER_1, LAUNCHER_UID_1, 10, "sigx"); // different signature @@ -6134,7 +6134,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_launcherNotRestored(true); } - public void testBackupAndRestore_launcherNoLongerBackupTarget() { + public void BackupAndRestore_launcherNoLongerBackupTarget() { prepareForBackupTest(); updatePackageInfo(LAUNCHER_1, @@ -6239,7 +6239,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_launcherAndPackageNoLongerBackupTarget() { + public void BackupAndRestore_launcherAndPackageNoLongerBackupTarget() { prepareForBackupTest(); updatePackageInfo(CALLING_PACKAGE_1, @@ -6337,7 +6337,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_disabled() { + public void BackupAndRestore_disabled() { prepareCrossProfileDataSet(); // Before doing backup & restore, disable s1. @@ -6402,7 +6402,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } - public void testBackupAndRestore_manifestRePublished() { + public void BackupAndRestore_manifestRePublished() { // Publish two manifest shortcuts. addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -6493,7 +6493,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * logcat. * - if it has allowBackup=false, we don't touch any of the existing shortcuts. */ - public void testBackupAndRestore_appAlreadyInstalledWhenRestored() { + public void BackupAndRestore_appAlreadyInstalledWhenRestored() { // Pre-backup. Same as testBackupAndRestore_manifestRePublished(). // Publish two manifest shortcuts. @@ -6618,7 +6618,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test for restoring the pre-P backup format. */ - public void testBackupAndRestore_api27format() throws Exception { + public void BackupAndRestore_api27format() throws Exception { final byte[] payload = readTestAsset("shortcut/shortcut_api27_backup.xml").getBytes(); addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "22222"); @@ -6656,7 +6656,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } - public void testSaveAndLoad_crossProfile() { + public void SaveAndLoad_crossProfile() { prepareCrossProfileDataSet(); dumpsysOnLogcat("Before save & load"); @@ -6859,7 +6859,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { .getPackageUserId()); } - public void testOnApplicationActive_permission() { + public void OnApplicationActive_permission() { assertExpectException(SecurityException.class, "Missing permission", () -> mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0)); @@ -6868,7 +6868,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0); } - public void testGetShareTargets_permission() { + public void GetShareTargets_permission() { addPackage(CHOOSER_ACTIVITY_PACKAGE, CHOOSER_ACTIVITY_UID, 10, "sig1"); mInjectedChooserActivity = ComponentName.createRelative(CHOOSER_ACTIVITY_PACKAGE, ".ChooserActivity"); @@ -6887,7 +6887,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHasShareTargets_permission() { + public void HasShareTargets_permission() { assertExpectException(SecurityException.class, "Missing permission", () -> mManager.hasShareTargets(CALLING_PACKAGE_1)); @@ -6896,7 +6896,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mManager.hasShareTargets(CALLING_PACKAGE_1); } - public void testisSharingShortcut_permission() throws IntentFilter.MalformedMimeTypeException { + public void isSharingShortcut_permission() throws IntentFilter.MalformedMimeTypeException { setCaller(LAUNCHER_1, USER_0); IntentFilter filter_any = new IntentFilter(); @@ -6911,18 +6911,18 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mManager.hasShareTargets(CALLING_PACKAGE_1); } - public void testDumpsys_crossProfile() { + public void Dumpsys_crossProfile() { prepareCrossProfileDataSet(); dumpsysOnLogcat("test1", /* force= */ true); } - public void testDumpsys_withIcons() throws IOException { - testIcons(); + public void Dumpsys_withIcons() throws IOException { + Icons(); // Dump after having some icons. dumpsysOnLogcat("test1", /* force= */ true); } - public void testManifestShortcut_publishOnUnlockUser() { + public void ManifestShortcut_publishOnUnlockUser() { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_1); @@ -7136,7 +7136,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertNull(mService.getPackageShortcutForTest(LAUNCHER_1, USER_0)); } - public void testManifestShortcut_publishOnBroadcast() { + public void ManifestShortcut_publishOnBroadcast() { // First, no packages are installed. uninstallPackage(USER_0, CALLING_PACKAGE_1); uninstallPackage(USER_0, CALLING_PACKAGE_2); @@ -7392,7 +7392,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_missingMandatoryFields() { + public void ManifestShortcuts_missingMandatoryFields() { // Start with no apps installed. uninstallPackage(USER_0, CALLING_PACKAGE_1); uninstallPackage(USER_0, CALLING_PACKAGE_2); @@ -7461,7 +7461,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_intentDefinitions() { + public void ManifestShortcuts_intentDefinitions() { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_error_4); @@ -7603,7 +7603,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_checkAllFields() { + public void ManifestShortcuts_checkAllFields() { mService.handleUnlockUser(USER_0); // Package 1 updated, which has one valid manifest shortcut and one invalid. @@ -7708,7 +7708,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_localeChange() throws InterruptedException { + public void ManifestShortcuts_localeChange() throws InterruptedException { mService.handleUnlockUser(USER_0); // Package 1 updated, which has one valid manifest shortcut and one invalid. @@ -7812,7 +7812,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_updateAndDisabled_notPinned() { + public void ManifestShortcuts_updateAndDisabled_notPinned() { mService.handleUnlockUser(USER_0); // First, just publish a manifest shortcut. @@ -7852,7 +7852,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_updateAndDisabled_pinned() { + public void ManifestShortcuts_updateAndDisabled_pinned() { mService.handleUnlockUser(USER_0); // First, just publish a manifest shortcut. @@ -7908,7 +7908,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_duplicateInSingleActivity() { + public void ManifestShortcuts_duplicateInSingleActivity() { mService.handleUnlockUser(USER_0); // The XML has two shortcuts with the same ID. @@ -7933,7 +7933,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_duplicateInTwoActivities() { + public void ManifestShortcuts_duplicateInTwoActivities() { mService.handleUnlockUser(USER_0); // ShortcutActivity has shortcut ms1 @@ -7985,7 +7985,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Manifest shortcuts cannot override shortcuts that were published via the APIs. */ - public void testManifestShortcuts_cannotOverrideNonManifest() { + public void ManifestShortcuts_cannotOverrideNonManifest() { mService.handleUnlockUser(USER_0); // Create a non-pinned dynamic shortcut and a non-dynamic pinned shortcut. @@ -8058,7 +8058,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Make sure the APIs won't work on manifest shortcuts. */ - public void testManifestShortcuts_immutable() { + public void ManifestShortcuts_immutable() { mService.handleUnlockUser(USER_0); // Create a non-pinned manifest shortcut, a pinned shortcut that was originally @@ -8151,7 +8151,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Make sure the APIs won't work on manifest shortcuts. */ - public void testManifestShortcuts_tooMany() { + public void ManifestShortcuts_tooMany() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8170,7 +8170,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testMaxShortcutCount_set() { + public void MaxShortcutCount_set() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8251,7 +8251,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testMaxShortcutCount_add() { + public void MaxShortcutCount_add() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8378,7 +8378,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testMaxShortcutCount_update() { + public void MaxShortcutCount_update() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8469,7 +8469,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testShortcutsPushedOutByManifest() { + public void ShortcutsPushedOutByManifest() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8577,7 +8577,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testReturnedByServer() { + public void ReturnedByServer() { // Package 1 updated, with manifest shortcuts. addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -8623,7 +8623,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testIsForegroundDefaultLauncher_true() { + public void IsForegroundDefaultLauncher_true() { final int uid = 1024; setDefaultLauncher(UserHandle.USER_SYSTEM, "default"); @@ -8633,7 +8633,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } - public void testIsForegroundDefaultLauncher_defaultButNotForeground() { + public void IsForegroundDefaultLauncher_defaultButNotForeground() { final int uid = 1024; setDefaultLauncher(UserHandle.USER_SYSTEM, "default"); @@ -8642,7 +8642,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertFalse(mInternal.isForegroundDefaultLauncher("default", uid)); } - public void testIsForegroundDefaultLauncher_foregroundButNotDefault() { + public void IsForegroundDefaultLauncher_foregroundButNotDefault() { final int uid = 1024; setDefaultLauncher(UserHandle.USER_SYSTEM, "default"); @@ -8651,7 +8651,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertFalse(mInternal.isForegroundDefaultLauncher("another", uid)); } - public void testParseShareTargetsFromManifest() { + public void ParseShareTargetsFromManifest() { // These values must exactly match the content of shortcuts_share_targets.xml resource List<ShareTargetInfo> expectedValues = new ArrayList<>(); expectedValues.add(new ShareTargetInfo( @@ -8703,7 +8703,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } } - public void testShareTargetInfo_saveToXml() throws IOException, XmlPullParserException { + public void ShareTargetInfo_saveToXml() throws IOException, XmlPullParserException { List<ShareTargetInfo> expectedValues = new ArrayList<>(); expectedValues.add(new ShareTargetInfo( new ShareTargetInfo.TargetData[]{new ShareTargetInfo.TargetData( @@ -8769,7 +8769,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } } - public void testIsSharingShortcut() throws IntentFilter.MalformedMimeTypeException { + public void IsSharingShortcut() throws IntentFilter.MalformedMimeTypeException { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_share_targets); @@ -8819,7 +8819,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { filter_any)); } - public void testIsSharingShortcut_PinnedAndCachedOnlyShortcuts() + public void IsSharingShortcut_PinnedAndCachedOnlyShortcuts() throws IntentFilter.MalformedMimeTypeException { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -8876,7 +8876,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { filter_any)); } - public void testAddingShortcuts_ExcludesHiddenFromLauncherShortcuts() { + public void AddingShortcuts_ExcludesHiddenFromLauncherShortcuts() { final ShortcutInfo s1 = makeShortcutExcludedFromLauncher("s1"); final ShortcutInfo s2 = makeShortcutExcludedFromLauncher("s2"); final ShortcutInfo s3 = makeShortcutExcludedFromLauncher("s3"); @@ -8897,7 +8897,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testUpdateShortcuts_ExcludesHiddenFromLauncherShortcuts() { + public void UpdateShortcuts_ExcludesHiddenFromLauncherShortcuts() { final ShortcutInfo s1 = makeShortcut("s1"); final ShortcutInfo s2 = makeShortcut("s2"); final ShortcutInfo s3 = makeShortcut("s3"); @@ -8910,7 +8910,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinHiddenShortcuts_ThrowsException() { + public void PinHiddenShortcuts_ThrowsException() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertThrown(IllegalArgumentException.class, () -> { mManager.requestPinShortcut(makeShortcutExcludedFromLauncher("s1"), null); diff --git a/services/tests/servicestests/src/com/android/server/utils/LazyJniRegistrarTest.java b/services/tests/servicestests/src/com/android/server/utils/LazyJniRegistrarTest.java new file mode 100644 index 000000000000..a2df73b7d540 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/utils/LazyJniRegistrarTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.utils; + +import android.platform.test.annotations.Presubmit; + +import androidx.test.filters.SmallTest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +@SmallTest +@Presubmit +@RunWith(JUnit4.class) +public class LazyJniRegistrarTest { + + @Test + public void testNativeMethodsResolve() throws Exception { + // Basic test with a few explicit invocations to make sure methods resolve and don't throw. + LazyJniRegistrar.registerConsumerIrService(); + LazyJniRegistrar.registerGameManagerService(); + LazyJniRegistrar.registerVrManagerService(); + } + + @Test + public void testAllNativeRegisterMethodsResolve() throws Exception { + // Catch-all test to make sure public static register* methods resolve and don't throw. + for (Method method : LazyJniRegistrar.class.getDeclaredMethods()) { + if (Modifier.isPublic(method.getModifiers()) + && Modifier.isStatic(method.getModifiers()) + && method.getName().startsWith("register")) { + method.invoke(null); + } + } + } + + // TODO(b/302724778): Remove manual JNI load + static { + System.loadLibrary("servicestestjni"); + } +} diff --git a/services/tests/servicestests/src/com/android/server/utils/OWNERS b/services/tests/servicestests/src/com/android/server/utils/OWNERS index f5b19a1c40ae..69b9fa23c040 100644 --- a/services/tests/servicestests/src/com/android/server/utils/OWNERS +++ b/services/tests/servicestests/src/com/android/server/utils/OWNERS @@ -1,5 +1,6 @@ per-file EventLoggerTest.java = file:/platform/frameworks/av:/media/janitors/media_solutions_OWNERS per-file EventLoggerTest.java = jmtrivi@google.com +per-file LazyJniRegistrarTest.java = file:/PERFORMANCE_OWNERS # Bug component : 158088 = per-file AnrTimer*.java per-file AnrTimer*.java = file:/PERFORMANCE_OWNERS 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 074cbb57d5b7..1fc0d245fbe5 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -311,6 +311,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.R; import com.android.internal.config.sysui.TestableFlagResolver; +import com.android.internal.logging.InstanceId; import com.android.internal.logging.InstanceIdSequence; import com.android.internal.logging.InstanceIdSequenceFake; import com.android.internal.messages.nano.SystemMessageProto; @@ -7637,7 +7638,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mTestNotificationChannel, 1, null, true)); when(r1.getLifespanMs(anyLong())).thenReturn(234); - r1.getSbn().setInstanceId(mNotificationInstanceIdSequence.newInstanceId()); + InstanceId instanceId1 = mNotificationInstanceIdSequence.newInstanceId(); + r1.getSbn().setInstanceId(instanceId1); // Enqueues the notification to be posted, so hasPosted will be false. mService.addEnqueuedNotification(r1); @@ -7648,8 +7650,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { r1.getSbn().getPackageName(), r1.getKey(), signals, "", r1.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment1); - assertTrue(mService.checkLastClassificationChannelLog(false /*hasPosted*/, - true /*isAlerting*/, 3 /*TYPE_NEWS*/, 234)); + assertTrue(mService.checkLastClassificationChannelLog(false /*=hasPosted*/, + true /*=isAlerting*/, Adjustment.TYPE_NEWS, 234, + NOTIFICATION_ADJUSTED.getId(), + instanceId1.getId(), r1.getUid())); // Set up notifications that will be adjusted // This notification starts on a low importance channel, so isAlerting is false. @@ -7659,7 +7663,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mLowImportanceNotificationChannel, 1, null, true)); when(r2.getLifespanMs(anyLong())).thenReturn(345); - r2.getSbn().setInstanceId(mNotificationInstanceIdSequence.newInstanceId()); + InstanceId instanceId2 = mNotificationInstanceIdSequence.newInstanceId(); + r2.getSbn().setInstanceId(instanceId2); // Adds the notification as already posted, so hasPosted will be true. mService.addNotification(r2); // The signal is removed when used so it has to be readded. @@ -7669,15 +7674,19 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { r2.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment2); assertTrue(mService.checkLastClassificationChannelLog(true /*hasPosted*/, - false /*isAlerting*/, 3 /*TYPE_NEWS*/, 345)); // currently failing + false /*isAlerting*/, Adjustment.TYPE_NEWS, 345, + NOTIFICATION_ADJUSTED.getId(), + instanceId2.getId() /*instance_id*/, r2.getUid())); signals.putInt(Adjustment.KEY_TYPE, Adjustment.TYPE_PROMOTION); Adjustment adjustment3 = new Adjustment( r2.getSbn().getPackageName(), r2.getKey(), signals, "", r2.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment3); - assertTrue(mService.checkLastClassificationChannelLog(true /*hasPosted*/, - false /*isAlerting*/, 1 /*TYPE_PROMOTION*/, 345)); + assertTrue(mService.checkLastClassificationChannelLog(true /*=hasPosted*/, + false /*=isAlerting*/, Adjustment.TYPE_PROMOTION, 345, + NOTIFICATION_ADJUSTED.getId(), + instanceId2.getId() /*instance_id*/, r2.getUid())); } @Test diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java index 65ed7b6e622d..934c33b7f1f1 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java @@ -19,6 +19,8 @@ import static com.google.common.truth.Truth.assertThat; import static java.util.concurrent.TimeUnit.HOURS; +import android.service.notification.RateEstimator; + import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java b/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java index ba91ca2323af..b4348194060a 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java @@ -16,6 +16,8 @@ package com.android.server.notification; +import static android.app.NotificationManager.IMPORTANCE_DEFAULT; + import android.companion.ICompanionDeviceManager; import android.content.ComponentName; import android.content.Context; @@ -25,6 +27,7 @@ import androidx.annotation.Nullable; import com.android.internal.logging.InstanceIdSequence; import com.android.server.notification.ManagedServices.ManagedServiceInfo; +import com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent; import java.util.HashSet; import java.util.Set; @@ -57,6 +60,9 @@ public class TestableNotificationManagerService extends NotificationManagerServi public boolean isAlerting; public long classification; public long lifetime; + public long eventId; + public long instanceId; + public long uid; } public ClassificationChannelLog lastClassificationChannelLog = null; @@ -221,20 +227,34 @@ public class TestableNotificationManagerService extends NotificationManagerServi } @Override - protected void logClassificationChannelAdjustmentReceived(boolean hasPosted, boolean isAlerting, - int classification, int lifetimeMs) { + protected void logClassificationChannelAdjustmentReceived(NotificationRecord r, + boolean hasPosted, + int classification) { + + boolean isAlerting = r.getChannel().getImportance() >= IMPORTANCE_DEFAULT; + int instanceId = r.getSbn().getInstanceId() == null + ? 0 : r.getSbn().getInstanceId().getId(); + int lifetimeMs = r.getLifespanMs(System.currentTimeMillis()); + int uid = r.getUid(); + lastClassificationChannelLog = new ClassificationChannelLog(); lastClassificationChannelLog.hasPosted = hasPosted; lastClassificationChannelLog.isAlerting = isAlerting; lastClassificationChannelLog.classification = classification; lastClassificationChannelLog.lifetime = lifetimeMs; + lastClassificationChannelLog.eventId = + NotificationReportedEvent.NOTIFICATION_ADJUSTED.getId(); + lastClassificationChannelLog.instanceId = instanceId; + lastClassificationChannelLog.uid = uid; } /** * Returns true if the last recorded classification channel log has all the values specified. */ public boolean checkLastClassificationChannelLog(boolean hasPosted, boolean isAlerting, - int classification, int lifetime) { + int classification, int lifetime, + int eventId, int instanceId, + int uid) { if (lastClassificationChannelLog == null) { return false; } @@ -242,6 +262,9 @@ public class TestableNotificationManagerService extends NotificationManagerServi return hasPosted == lastClassificationChannelLog.hasPosted && isAlerting == lastClassificationChannelLog.isAlerting && classification == lastClassificationChannelLog.classification - && lifetime == lastClassificationChannelLog.lifetime; + && lifetime == lastClassificationChannelLog.lifetime + && eventId == lastClassificationChannelLog.eventId + && instanceId == lastClassificationChannelLog.instanceId + && uid == lastClassificationChannelLog.uid; } } diff --git a/services/tests/wmtests/res/xml/bookmarks.xml b/services/tests/wmtests/res/xml/bookmarks.xml index 3fc7c7692abc..cbbbc731753d 100644 --- a/services/tests/wmtests/res/xml/bookmarks.xml +++ b/services/tests/wmtests/res/xml/bookmarks.xml @@ -48,7 +48,7 @@ <bookmark category="android.intent.category.APP_CONTACTS" - androidprv:keycode="KEYCODE_C" + androidprv:keycode="KEYCODE_P" androidprv:modifierState="META|SHIFT" /> <bookmark diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java index 41865b209f01..9d4d94bebfd9 100644 --- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java @@ -26,12 +26,12 @@ import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAV import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_MUTE; import static com.android.server.policy.PhoneWindowManager.SETTINGS_KEY_BEHAVIOR_NOTIFICATION_PANEL; -import android.hardware.input.InputSettings; import android.hardware.input.KeyGestureEvent; import android.os.RemoteException; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; +import android.provider.Settings; import android.view.KeyEvent; import androidx.test.filters.MediumTest; @@ -758,54 +758,57 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase { } @Test - @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, - com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG}) - public void testKeyGestureToggleStickyKeys() { + public void testKeyGestureToggleDoNotDisturb() { + mPhoneWindowManager.overrideZenMode(Settings.Global.ZEN_MODE_OFF); Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS)); - Assert.assertTrue(InputSettings.isAccessibilityStickyKeysEnabled(mContext)); + sendKeyGestureEventComplete( + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB)); + mPhoneWindowManager.assertZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); + mPhoneWindowManager.overrideZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS)); - Assert.assertFalse(InputSettings.isAccessibilityStickyKeysEnabled(mContext)); + sendKeyGestureEventComplete( + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB)); + mPhoneWindowManager.assertZenMode(Settings.Global.ZEN_MODE_OFF); } @Test - @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, - com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG}) - public void testKeyGestureToggleSlowKeys() { - Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS)); - Assert.assertTrue(InputSettings.isAccessibilitySlowKeysEnabled(mContext)); + public void testLaunchSettingsAndSearchDoesntOpenAnything_withKeyguardOn() { + mPhoneWindowManager.overrideKeyguardOn(true); - Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS)); - Assert.assertFalse(InputSettings.isAccessibilitySlowKeysEnabled(mContext)); + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS); + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH); + + mPhoneWindowManager.assertNoActivityLaunched(); } @Test - @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, - com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS}) - public void testKeyGestureToggleMouseKeys() { - Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS)); - Assert.assertTrue(InputSettings.isAccessibilityMouseKeysEnabled(mContext)); + public void testLaunchSettingsAndSearchDoesntOpenAnything_withUserSetupIncomplete() { + mPhoneWindowManager.overrideIsUserSetupComplete(false); - Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS)); - Assert.assertFalse(InputSettings.isAccessibilityMouseKeysEnabled(mContext)); + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS); + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH); + + mPhoneWindowManager.assertNoActivityLaunched(); } @Test - @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, - com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG}) - public void testKeyGestureToggleBounceKeys() { - Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS)); - Assert.assertTrue(InputSettings.isAccessibilityBounceKeysEnabled(mContext)); + public void testLaunchAssistantDoesntWork_withKeyguardOn() { + mPhoneWindowManager.overrideKeyguardOn(true); - Assert.assertTrue( - sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS)); - Assert.assertFalse(InputSettings.isAccessibilityBounceKeysEnabled(mContext)); + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT); + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT); + + mPhoneWindowManager.assertSearchManagerDoesntLaunchAssist(); + } + + @Test + public void testLaunchAssistantDoesntWork_withUserSetupIncomplete() { + mPhoneWindowManager.overrideIsUserSetupComplete(false); + + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT); + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT); + + mPhoneWindowManager.assertSearchManagerDoesntLaunchAssist(); } } diff --git a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java index 1cc4db91b1d3..05a1482b9be6 100644 --- a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java @@ -18,22 +18,15 @@ package com.android.server.policy; import static android.view.KeyEvent.KEYCODE_POWER; import static android.view.KeyEvent.KEYCODE_VOLUME_UP; -import static com.android.hardware.input.Flags.FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW; import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_ASSISTANT; import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_GLOBAL_ACTIONS; -import static com.android.server.policy.PhoneWindowManager.POWER_MULTI_PRESS_TIMEOUT_MILLIS; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_DREAM_OR_SLEEP; import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_GO_TO_SLEEP; -import static org.junit.Assert.assertEquals; - -import android.platform.test.annotations.EnableFlags; -import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.view.Display; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; /** @@ -46,12 +39,8 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { @Before public void setUp() { setUpPhoneWindowManager(); - mPhoneWindowManager.overrideStatusBarManagerInternal(); } - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - /** * Power single press to turn screen on/off. */ @@ -61,8 +50,6 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { sendKey(KEYCODE_POWER); mPhoneWindowManager.assertPowerSleep(); - mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS); - // turn screen on when begin from non-interactive. mPhoneWindowManager.overrideDisplayState(Display.STATE_OFF); sendKey(KEYCODE_POWER); @@ -103,7 +90,7 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { mPhoneWindowManager.overrideCanStartDreaming(false); sendKey(KEYCODE_POWER); sendKey(KEYCODE_POWER); - mPhoneWindowManager.assertDoublePowerLaunch(); + mPhoneWindowManager.assertCameraLaunch(); mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished(); } @@ -114,7 +101,7 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { public void testPowerDoublePress() { sendKey(KEYCODE_POWER); sendKey(KEYCODE_POWER); - mPhoneWindowManager.assertDoublePowerLaunch(); + mPhoneWindowManager.assertCameraLaunch(); } /** @@ -124,14 +111,12 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { public void testPowerLongPress() { // Show assistant. mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_ASSISTANT); - sendKey(KEYCODE_POWER, SingleKeyGestureDetector.sDefaultLongPressTimeout); + sendKey(KEYCODE_POWER, true); mPhoneWindowManager.assertSearchManagerLaunchAssist(); - mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS); - // Show global actions. mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_GLOBAL_ACTIONS); - sendKey(KEYCODE_POWER, SingleKeyGestureDetector.sDefaultLongPressTimeout); + sendKey(KEYCODE_POWER, true); mPhoneWindowManager.assertShowGlobalActionsCalled(); } @@ -156,139 +141,4 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase { sendKey(KEYCODE_POWER); mPhoneWindowManager.assertNoPowerSleep(); } - - /** - * Double press of power when the window handles the power key events. The - * system double power gesture launch should not be performed. - */ - @Test - @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW) - public void testPowerDoublePress_windowHasOverridePermissionAndKeysHandled() { - mPhoneWindowManager.overrideCanWindowOverridePowerKey(true); - setDispatchedKeyHandler(keyEvent -> true); - - sendKey(KEYCODE_POWER); - sendKey(KEYCODE_POWER); - - mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished(); - - mPhoneWindowManager.assertNoDoublePowerLaunch(); - } - - /** - * Double press of power when the window doesn't handle the power key events. - * The system default gesture launch should be performed and the app should receive both events. - */ - @Test - @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW) - public void testPowerDoublePress_windowHasOverridePermissionAndKeysUnHandled() { - mPhoneWindowManager.overrideCanWindowOverridePowerKey(true); - setDispatchedKeyHandler(keyEvent -> false); - - sendKey(KEYCODE_POWER); - sendKey(KEYCODE_POWER); - - mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished(); - mPhoneWindowManager.assertDoublePowerLaunch(); - assertEquals(getDownKeysDispatched(), 2); - assertEquals(getUpKeysDispatched(), 2); - } - - /** - * Triple press of power when the window handles the power key double press gesture. - * The system default gesture launch should not be performed, and the app only receives the - * first two presses. - */ - @Test - @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW) - public void testPowerTriplePress_windowHasOverridePermissionAndKeysHandled() { - mPhoneWindowManager.overrideCanWindowOverridePowerKey(true); - setDispatchedKeyHandler(keyEvent -> true); - - sendKey(KEYCODE_POWER); - sendKey(KEYCODE_POWER); - sendKey(KEYCODE_POWER); - - mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished(); - mPhoneWindowManager.assertNoDoublePowerLaunch(); - assertEquals(getDownKeysDispatched(), 2); - assertEquals(getUpKeysDispatched(), 2); - } - - /** - * Tests a single press, followed by a double press when the window can handle the power key. - * The app should receive all 3 events. - */ - @Test - @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW) - public void testPowerTriplePressWithDelay_windowHasOverridePermissionAndKeysHandled() { - mPhoneWindowManager.overrideCanWindowOverridePowerKey(true); - setDispatchedKeyHandler(keyEvent -> true); - - sendKey(KEYCODE_POWER); - mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS); - sendKey(KEYCODE_POWER); - sendKey(KEYCODE_POWER); - - mPhoneWindowManager.assertNoDoublePowerLaunch(); - assertEquals(getDownKeysDispatched(), 3); - assertEquals(getUpKeysDispatched(), 3); - } - - /** - * Tests single press when window doesn't handle the power key. Phone should go to sleep. - */ - @Test - @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW) - public void testPowerSinglePress_windowHasOverridePermissionAndKeyUnhandledByApp() { - mPhoneWindowManager.overrideCanWindowOverridePowerKey(true); - setDispatchedKeyHandler(keyEvent -> false); - mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_GO_TO_SLEEP); - - sendKey(KEYCODE_POWER); - - mPhoneWindowManager.assertPowerSleep(); - } - - /** - * Tests single press when the window handles the power key. Phone should go to sleep after a - * delay of {POWER_MULTI_PRESS_TIMEOUT_MILLIS} - */ - @Test - @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW) - public void testPowerSinglePress_windowHasOverridePermissionAndKeyHandledByApp() { - mPhoneWindowManager.overrideCanWindowOverridePowerKey(true); - setDispatchedKeyHandler(keyEvent -> true); - mPhoneWindowManager.overrideDisplayState(Display.STATE_ON); - mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_GO_TO_SLEEP); - - sendKey(KEYCODE_POWER); - - mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS); - - mPhoneWindowManager.assertPowerSleep(); - } - - - /** - * Tests 5x press when the window handles the power key. Emergency gesture should still be - * launched. - */ - @Test - @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW) - public void testPowerFiveTimesPress_windowHasOverridePermissionAndKeyHandledByApp() { - mPhoneWindowManager.overrideCanWindowOverridePowerKey(true); - setDispatchedKeyHandler(keyEvent -> true); - mPhoneWindowManager.overrideDisplayState(Display.STATE_ON); - mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_GO_TO_SLEEP); - - for (int i = 0; i < 5; ++i) { - sendKey(KEYCODE_POWER); - mPhoneWindowManager.moveTimeForward(100); - } - - mPhoneWindowManager.assertEmergencyLaunch(); - assertEquals(getDownKeysDispatched(), 2); - assertEquals(getUpKeysDispatched(), 2); - } } diff --git a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java index 2329a0728baf..9e47a008592c 100644 --- a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java +++ b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java @@ -85,11 +85,7 @@ class ShortcutKeyTestBase { private Resources mResources; private PackageManager mPackageManager; TestPhoneWindowManager mPhoneWindowManager; - - DispatchedKeyHandler mDispatchedKeyHandler; - private int mDownKeysDispatched; - private int mUpKeysDispatched; - + DispatchedKeyHandler mDispatchedKeyHandler = event -> false; Context mContext; /** Modifier key to meta state */ @@ -120,9 +116,6 @@ class ShortcutKeyTestBase { XmlResourceParser testBookmarks = mResources.getXml( com.android.frameworks.wmtests.R.xml.bookmarks); doReturn(testBookmarks).when(mResources).getXml(com.android.internal.R.xml.bookmarks); - mDispatchedKeyHandler = event -> false; - mDownKeysDispatched = 0; - mUpKeysDispatched = 0; try { // Keep packageName / className in sync with @@ -236,10 +229,6 @@ class ShortcutKeyTestBase { sendKeyCombination(new int[]{keyCode}, 0 /*durationMillis*/, longPress, DEFAULT_DISPLAY); } - void sendKey(int keyCode, long durationMillis) { - sendKeyCombination(new int[]{keyCode}, durationMillis, false, DEFAULT_DISPLAY); - } - boolean sendKeyGestureEventStart(int gestureType) { return mPhoneWindowManager.sendKeyGestureEvent( new KeyGestureEvent.Builder().setKeyGestureType(gestureType).setAction( @@ -289,14 +278,6 @@ class ShortcutKeyTestBase { doReturn(expectedBehavior).when(mResources).getInteger(eq(resId)); } - int getDownKeysDispatched() { - return mDownKeysDispatched; - } - - int getUpKeysDispatched() { - return mUpKeysDispatched; - } - private void interceptKey(KeyEvent keyEvent) { int actions = mPhoneWindowManager.interceptKeyBeforeQueueing(keyEvent); if ((actions & ACTION_PASS_TO_USER) != 0) { @@ -304,11 +285,6 @@ class ShortcutKeyTestBase { if (!mDispatchedKeyHandler.onKeyDispatched(keyEvent)) { mPhoneWindowManager.interceptUnhandledKey(keyEvent); } - if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) { - ++mDownKeysDispatched; - } else { - ++mUpKeysDispatched; - } } } mPhoneWindowManager.dispatchAllPendingEvents(); diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index f06b45e94f77..285d94d2fafe 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -22,7 +22,6 @@ import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.STATE_ON; import static android.view.WindowManagerPolicyConstants.FLAG_INTERACTIVE; -import static com.android.hardware.input.Flags.overridePowerKeyBehaviorInFocusedWindow; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyLong; @@ -46,14 +45,10 @@ import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_SHUT import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM; import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_MUTE; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.CALLS_REAL_METHODS; import static org.mockito.Mockito.after; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.description; import static org.mockito.Mockito.mockingDetails; import static org.mockito.Mockito.timeout; @@ -90,9 +85,7 @@ import android.os.VibratorInfo; import android.os.test.TestLooper; import android.provider.Settings; import android.service.dreams.DreamManagerInternal; -import android.service.quickaccesswallet.QuickAccessWalletClient; import android.telecom.TelecomManager; -import android.util.MutableBoolean; import android.view.Display; import android.view.InputEvent; import android.view.KeyCharacterMap; @@ -102,12 +95,9 @@ import android.view.autofill.AutofillManagerInternal; import com.android.dx.mockito.inline.extended.StaticMockitoSession; import com.android.internal.accessibility.AccessibilityShortcutController; -import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.UiEventLogger; import com.android.internal.policy.KeyInterceptionInfo; import com.android.server.GestureLauncherService; import com.android.server.LocalServices; -import com.android.server.SystemService; import com.android.server.input.InputManagerInternal; import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.pm.UserManagerInternal; @@ -130,7 +120,6 @@ import org.mockito.MockSettings; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.quality.Strictness; -import org.mockito.stubbing.Answer; import java.util.List; import java.util.function.Supplier; @@ -143,8 +132,6 @@ class TestPhoneWindowManager { private PhoneWindowManager mPhoneWindowManager; private Context mContext; - private GestureLauncherService mGestureLauncherService; - @Mock private WindowManagerInternal mWindowManagerInternal; @Mock private ActivityManagerInternal mActivityManagerInternal; @@ -176,9 +163,7 @@ class TestPhoneWindowManager { @Mock private DisplayRotation mDisplayRotation; @Mock private DisplayPolicy mDisplayPolicy; @Mock private WindowManagerPolicy.ScreenOnListener mScreenOnListener; - @Mock private QuickAccessWalletClient mQuickAccessWalletClient; - @Mock private MetricsLogger mMetricsLogger; - @Mock private UiEventLogger mUiEventLogger; + @Mock private GestureLauncherService mGestureLauncherService; @Mock private GlobalActions mGlobalActions; @Mock private AccessibilityShortcutController mAccessibilityShortcutController; @@ -207,8 +192,6 @@ class TestPhoneWindowManager { private int mKeyEventPolicyFlags = FLAG_INTERACTIVE; - private int mProcessPowerKeyDownCount = 0; - private class TestTalkbackShortcutController extends TalkbackShortcutController { TestTalkbackShortcutController(Context context) { super(context); @@ -277,8 +260,6 @@ class TestPhoneWindowManager { MockitoAnnotations.initMocks(this); mHandler = new Handler(mTestLooper.getLooper()); mContext = mockingDetails(context).isSpy() ? context : spy(context); - mGestureLauncherService = spy(new GestureLauncherService(mContext, mMetricsLogger, - mQuickAccessWalletClient, mUiEventLogger)); setUp(supportSettingsUpdate); mTestLooper.dispatchAll(); } @@ -291,7 +272,6 @@ class TestPhoneWindowManager { mMockitoSession = mockitoSession() .mockStatic(LocalServices.class, spyStubOnly) .mockStatic(KeyCharacterMap.class) - .mockStatic(GestureLauncherService.class) .strictness(Strictness.LENIENT) .startMocking(); @@ -314,16 +294,6 @@ class TestPhoneWindowManager { () -> LocalServices.getService(eq(PowerManagerInternal.class))); doReturn(mDisplayManagerInternal).when( () -> LocalServices.getService(eq(DisplayManagerInternal.class))); - doReturn(true).when( - () -> GestureLauncherService.isCameraDoubleTapPowerSettingEnabled(any(), anyInt()) - ); - doReturn(true).when( - () -> GestureLauncherService.isEmergencyGestureSettingEnabled(any(), anyInt()) - ); - doReturn(true).when( - () -> GestureLauncherService.isGestureLauncherEnabled(any()) - ); - mGestureLauncherService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START); doReturn(mGestureLauncherService).when( () -> LocalServices.getService(eq(GestureLauncherService.class))); doReturn(mUserManagerInternal).when( @@ -405,8 +375,7 @@ class TestPhoneWindowManager { doNothing().when(mContext).startActivityAsUser(any(), any()); doNothing().when(mContext).startActivityAsUser(any(), any(), any()); - KeyInterceptionInfo interceptionInfo = new KeyInterceptionInfo(0, 0, null, 0, - /* inputFeatureFlags = */ 0); + KeyInterceptionInfo interceptionInfo = new KeyInterceptionInfo(0, 0, null, 0); doReturn(interceptionInfo) .when(mWindowManagerInternal).getKeyInterceptionInfoFromToken(any()); @@ -424,8 +393,6 @@ class TestPhoneWindowManager { eq(TEST_BROWSER_ROLE_PACKAGE_NAME)); doReturn(mSmsIntent).when(mPackageManager).getLaunchIntentForPackage( eq(TEST_SMS_ROLE_PACKAGE_NAME)); - mProcessPowerKeyDownCount = 0; - captureProcessPowerKeyDownCount(); Mockito.reset(mContext); } @@ -480,6 +447,14 @@ class TestPhoneWindowManager { mTestLooper.dispatchAll(); } + void overrideZenMode(int mode) { + doReturn(mode).when(mNotificationManager).getZenMode(); + } + + void assertZenMode(int mode) { + verify(mNotificationManager).setZenMode(eq(mode), any(), anyString(), eq(true)); + } + /** * Below functions will override the setting or the policy behavior. */ @@ -596,6 +571,10 @@ class TestPhoneWindowManager { doNothing().when(mPhoneWindowManager).launchHomeFromHotKey(anyInt()); } + void overrideKeyguardOn(boolean isKeyguardOn) { + doReturn(isKeyguardOn).when(mPhoneWindowManager).keyguardOn(); + } + void overrideIsUserSetupComplete(boolean isCompleted) { doReturn(isCompleted).when(mPhoneWindowManager).isUserSetupComplete(); } @@ -671,12 +650,6 @@ class TestPhoneWindowManager { .when(mButtonOverridePermissionChecker).canAppOverrideSystemKey(any(), anyInt()); } - void overrideCanWindowOverridePowerKey(boolean granted) { - doReturn(granted) - .when(mButtonOverridePermissionChecker).canWindowOverridePowerKey(any(), anyInt(), - anyInt()); - } - void overrideKeyEventPolicyFlags(int flags) { mKeyEventPolicyFlags = flags; } @@ -752,62 +725,21 @@ class TestPhoneWindowManager { verify(mPowerManager, never()).goToSleep(anyLong(), anyInt(), anyInt()); } - void assertDoublePowerLaunch() { - ArgumentCaptor<MutableBoolean> valueCaptor = ArgumentCaptor.forClass(MutableBoolean.class); - + void assertCameraLaunch() { mTestLooper.dispatchAll(); - verify(mGestureLauncherService, atLeast(2)) - .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture()); - verify(mGestureLauncherService, atMost(4)) - .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture()); - - if (overridePowerKeyBehaviorInFocusedWindow()) { - assertTrue(mProcessPowerKeyDownCount >= 2 && mProcessPowerKeyDownCount <= 4); - } - - List<Boolean> capturedValues = valueCaptor.getAllValues().stream() - .map(mutableBoolean -> mutableBoolean.value) - .toList(); - - assertTrue(capturedValues.contains(true)); + // GestureLauncherService should receive interceptPowerKeyDown twice. + verify(mGestureLauncherService, times(2)) + .interceptPowerKeyDown(any(), anyBoolean(), any()); } - void assertNoDoublePowerLaunch() { - ArgumentCaptor<MutableBoolean> valueCaptor = ArgumentCaptor.forClass(MutableBoolean.class); - - mTestLooper.dispatchAll(); - verify(mGestureLauncherService, atLeast(0)) - .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture()); - - List<Boolean> capturedValues = valueCaptor.getAllValues().stream() - .map(mutableBoolean -> mutableBoolean.value) - .toList(); - - assertTrue(capturedValues.stream().noneMatch(value -> value)); - } - - void assertEmergencyLaunch() { - ArgumentCaptor<MutableBoolean> valueCaptor = ArgumentCaptor.forClass(MutableBoolean.class); - + void assertSearchManagerLaunchAssist() { mTestLooper.dispatchAll(); - verify(mGestureLauncherService, atLeast(1)) - .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture()); - - if (overridePowerKeyBehaviorInFocusedWindow()) { - assertEquals(mProcessPowerKeyDownCount, 5); - } - - List<Boolean> capturedValues = valueCaptor.getAllValues().stream() - .map(mutableBoolean -> mutableBoolean.value) - .toList(); - - assertTrue(capturedValues.getLast()); + verify(mSearchManager).launchAssist(any()); } - - void assertSearchManagerLaunchAssist() { + void assertSearchManagerDoesntLaunchAssist() { mTestLooper.dispatchAll(); - verify(mSearchManager).launchAssist(any()); + verify(mSearchManager, never()).launchAssist(any()); } void assertLaunchSystemSettings() { @@ -1015,11 +947,9 @@ class TestPhoneWindowManager { .handleKeyGestureInKeyGestureController(anyInt(), any(), anyInt(), eq(gestureType)); } - private void captureProcessPowerKeyDownCount() { - doAnswer((Answer<Void>) invocation -> { - invocation.callRealMethod(); - mProcessPowerKeyDownCount++; - return null; - }).when(mGestureLauncherService).processPowerKeyDown(any()); + void assertNoActivityLaunched() { + mTestLooper.dispatchAll(); + verify(mContext, never()).startActivityAsUser(any(), any(), any()); + verify(mContext, never()).startActivityAsUser(any(), any()); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index d4a921c5f00a..661d07e09f99 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -554,6 +554,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testSetRequestedOrientationUpdatesConfiguration() throws Exception { + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord activity = new ActivityBuilder(mAtm) .setCreateTask(true) .setConfigChanges(ORIENTATION_CONFIG_CHANGES) @@ -641,6 +642,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void ignoreRequestedOrientationForResizableInSplitWindows() { + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord activity = createActivityWith2LevelTask(); final Task task = activity.getTask(); final Task rootTask = activity.getRootTask(); @@ -685,6 +687,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void respectRequestedOrientationForNonResizableInSplitWindows() { + mDisplayContent.setIgnoreOrientationRequest(false); final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea(); spyOn(tda); doReturn(true).when(tda).supportsNonResizableMultiWindow(); @@ -1906,6 +1909,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testActivityOnCancelFixedRotationTransform() { + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord activity = createActivityWithTask(); final DisplayRotation displayRotation = activity.mDisplayContent.getDisplayRotation(); final RemoteDisplayChangeController remoteDisplayChangeController = activity @@ -2054,6 +2058,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testFixedRotationSnapshotStartingWindow() { + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord activity = createActivityWithTask(); // TaskSnapshotSurface requires a fullscreen opaque window. final WindowManager.LayoutParams params = new WindowManager.LayoutParams( @@ -2278,6 +2283,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testSupportsFreeform() { final ActivityRecord activity = new ActivityBuilder(mAtm) + .setComponent(getUniqueComponentName(mContext.getPackageName())) .setCreateTask(true) .setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE) .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) @@ -2410,6 +2416,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testOrientationForScreenOrientationBehind() { + mDisplayContent.setIgnoreOrientationRequest(false); final Task task = createTask(mDisplayContent); // Activity below new ActivityBuilder(mAtm) @@ -2507,6 +2514,7 @@ public class ActivityRecordTests extends WindowTestsBase { @SetupWindows(addWindows = W_ACTIVITY) @Test public void testLandscapeSeascapeRotationByApp() { + mDisplayContent.setIgnoreOrientationRequest(false); final Task task = new TaskBuilder(mSupervisor) .setDisplay(mDisplayContent).setCreateActivity(true).build(); final ActivityRecord activity = task.getTopNonFinishingActivity(); @@ -2572,6 +2580,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test @Presubmit public void testGetOrientation() { + mDisplayContent.setIgnoreOrientationRequest(false); // ActivityBuilder will resume top activities and cause the activity been added into // opening apps list. Since this test is focus on the effect of visible on getting // orientation, we skip app transition to avoid interference. @@ -2663,8 +2672,8 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testSetOrientation_restrictedByTargetSdk() { mSetFlagsRule.enableFlags(Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT); - mDisplayContent.setIgnoreOrientationRequest(true); makeDisplayLargeScreen(mDisplayContent); + assertTrue(mDisplayContent.getIgnoreOrientationRequest()); assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_SOCIAL, false); assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_GAME, true); @@ -2702,6 +2711,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testRespectTopFullscreenOrientation() { + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); final Configuration displayConfig = activity.mDisplayContent.getConfiguration(); final Configuration activityConfig = activity.getConfiguration(); @@ -3243,7 +3253,6 @@ public class ActivityRecordTests extends WindowTestsBase { assertFalse(activity.isVisibleRequested()); player.start(); - mSetFlagsRule.enableFlags(Flags.FLAG_RESET_DRAW_STATE_ON_CLIENT_INVISIBLE); // ActivityRecord#commitVisibility(false) -> WindowState#sendAppVisibilityToClients(). player.finish(); assertFalse(activity.isVisible()); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index e0b29c937381..1cb1e3cae413 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -511,6 +511,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { @Test public void testSupportsMultiWindow_nonResizable() { final ActivityRecord activity = new ActivityBuilder(mAtm) + .setComponent(getUniqueComponentName(mContext.getPackageName())) .setCreateTask(true) .setResizeMode(RESIZE_MODE_UNRESIZEABLE) .build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java index 40da9ea2d718..579ed6659976 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java @@ -365,8 +365,8 @@ public class BackNavigationControllerTests extends WindowTestsBase { assertTrue(outPrevActivities.isEmpty()); assertTrue(predictable); // reset - tf1.setAdjacentTaskFragment(null); - tf2.setAdjacentTaskFragment(null); + tf1.clearAdjacentTaskFragments(); + tf2.clearAdjacentTaskFragments(); tf1.setCompanionTaskFragment(null); tf2.setCompanionTaskFragment(null); @@ -398,8 +398,8 @@ public class BackNavigationControllerTests extends WindowTestsBase { assertTrue(predictable); // reset outPrevActivities.clear(); - tf2.setAdjacentTaskFragment(null); - tf3.setAdjacentTaskFragment(null); + tf2.clearAdjacentTaskFragments(); + tf3.clearAdjacentTaskFragments(); final TaskFragment tf4 = createTaskFragmentWithActivity(task); // Stacked + next companion to top => predict for previous activity below companion. diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java index 87dbca51e24e..060b379c1281 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java @@ -84,6 +84,7 @@ public class DisplayAreaGroupTest extends WindowTestsBase { @Test public void testGetRequestedOrientationForDisplay() { + mDisplayContent.setIgnoreOrientationRequest(false); final Task task = new TaskBuilder(mSupervisor) .setTaskDisplayArea(mTaskDisplayArea).setCreateActivity(true).build(); final ActivityRecord activity = task.getTopNonFinishingActivity(); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java index 7b2cd63b4afb..0a7df5a305bc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java @@ -491,6 +491,7 @@ public class DisplayAreaTest extends WindowTestsBase { @Test public void testSetIgnoreOrientationRequest_callSuperOnDescendantOrientationChangedNoSensor() { final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea(); + mDisplayContent.setIgnoreOrientationRequest(false); final Task stack = new TaskBuilder(mSupervisor).setOnTop(!ON_TOP).setCreateActivity(true).build(); final ActivityRecord activity = stack.getTopNonFinishingActivity(); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 9cbea2e2f0ad..db71f2bf039d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -898,6 +898,7 @@ public class DisplayContentTests extends WindowTestsBase { public void testOrientationDefinedByKeyguard() { final DisplayContent dc = mDisplayContent; dc.getDisplayPolicy().setAwake(true); + dc.setIgnoreOrientationRequest(false); // Create a window that requests landscape orientation. It will define device orientation // by default. @@ -925,6 +926,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testOrientationForAspectRatio() { final DisplayContent dc = createNewDisplay(); + dc.setIgnoreOrientationRequest(false); // When display content is created its configuration is not yet initialized, which could // cause unnecessary configuration propagation, so initialize it here. @@ -1034,6 +1036,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testAllowsTopmostFullscreenOrientation() { final DisplayContent dc = createNewDisplay(); + dc.setIgnoreOrientationRequest(false); assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, dc.getOrientation()); dc.getDisplayRotation().setFixedToUserRotation( IWindowManager.FIXED_TO_USER_ROTATION_DISABLED); @@ -1112,6 +1115,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testOnDescendantOrientationRequestChanged() { final DisplayContent dc = createNewDisplay(); + dc.setIgnoreOrientationRequest(false); dc.getDisplayRotation().setFixedToUserRotation( IWindowManager.FIXED_TO_USER_ROTATION_DISABLED); dc.getDefaultTaskDisplayArea().setWindowingMode(WINDOWING_MODE_FULLSCREEN); @@ -1130,6 +1134,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testOnDescendantOrientationRequestChanged_FrozenToUserRotation() { final DisplayContent dc = createNewDisplay(); + dc.setIgnoreOrientationRequest(false); dc.getDisplayRotation().setFixedToUserRotation( IWindowManager.FIXED_TO_USER_ROTATION_ENABLED); dc.getDisplayRotation().setUserRotation( @@ -1152,6 +1157,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testOrientationBehind() { assertNull(mDisplayContent.getLastOrientationSource()); + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord prev = new ActivityBuilder(mAtm).setCreateTask(true) .setScreenOrientation(getRotatedOrientation(mDisplayContent)).build(); prev.setVisibleRequested(false); @@ -1172,6 +1178,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testFixedToUserRotationChanged() { final DisplayContent dc = createNewDisplay(); + dc.setIgnoreOrientationRequest(false); dc.getDisplayRotation().setFixedToUserRotation( IWindowManager.FIXED_TO_USER_ROTATION_ENABLED); dc.getDisplayRotation().setUserRotation( @@ -1589,6 +1596,7 @@ public class DisplayContentTests extends WindowTestsBase { W_INPUT_METHOD, W_NOTIFICATION_SHADE }) @Test public void testApplyTopFixedRotationTransform() { + mDisplayContent.setIgnoreOrientationRequest(false); final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); spyOn(displayPolicy); // Only non-movable (gesture) navigation bar will be animated by fixed rotation animation. @@ -1742,6 +1750,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testFixedRotationWithPip() { final DisplayContent displayContent = mDefaultDisplay; + displayContent.setIgnoreOrientationRequest(false); unblockDisplayRotation(displayContent); // Unblock the condition in PinnedTaskController#continueOrientationChangeIfNeeded. doNothing().when(displayContent).prepareAppTransition(anyInt()); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java index 63973345b5fb..6527af1ec704 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java @@ -77,7 +77,7 @@ public class DisplayRotationImmersiveAppCompatPolicyTests extends WindowTestsBas when(mMockActivityRecord.findMainWindow()).thenReturn(mMockWindowState); doReturn(mMockActivityRecord).when(mDisplayContent).topRunningActivity(); - when(mDisplayContent.getIgnoreOrientationRequest()).thenReturn(true); + mDisplayContent.setIgnoreOrientationRequest(true); mMockAppCompatConfiguration = mock(AppCompatConfiguration.class); when(mMockAppCompatConfiguration.isDisplayRotationImmersiveAppCompatPolicyEnabled()) @@ -195,7 +195,7 @@ public class DisplayRotationImmersiveAppCompatPolicyTests extends WindowTestsBas @Test public void testIsRotationLockEnforced_ignoreOrientationRequestDisabled_lockNotEnforced() { - when(mDisplayContent.getIgnoreOrientationRequest()).thenReturn(false); + mDisplayContent.setIgnoreOrientationRequest(false); assertIsRotationLockEnforcedReturnsFalseForAllRotations(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java index 708d6860abc2..bd15bc42e811 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java @@ -106,6 +106,8 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { // Display: 1920x1200 (landscape). First and second display are both 860x1200 (portrait). mDisplay = new DualDisplayContent.Builder(mAtm, 1920, 1200).build(); + // The test verifies that the display area can affect display's getLastOrientation(). + mDisplay.setIgnoreOrientationRequest(false); mFirstRoot = mDisplay.mFirstRoot; mSecondRoot = mDisplay.mSecondRoot; mFirstTda = mDisplay.getTaskDisplayArea(FEATURE_FIRST_TASK_CONTAINER); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java index 7cb62c5a6769..d96512588c7c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java @@ -132,6 +132,7 @@ public class RootTaskTests extends WindowTestsBase { @Test public void testClosingAppDifferentTaskOrientation() { + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord activity1 = createActivityRecord(mDisplayContent); activity1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); @@ -146,6 +147,7 @@ public class RootTaskTests extends WindowTestsBase { @Test public void testMoveTaskToBackDifferentTaskOrientation() { + mDisplayContent.setIgnoreOrientationRequest(false); final ActivityRecord activity1 = createActivityRecord(mDisplayContent); activity1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index 7e8bd38fb6a9..699ed0263756 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -41,6 +41,7 @@ import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP; import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS_AND_RESTORE; import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; + import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; @@ -63,6 +64,7 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; import android.app.ActivityOptions; import android.app.WindowConfiguration; @@ -77,12 +79,14 @@ import android.graphics.Rect; import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; +import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.util.Pair; import androidx.test.filters.MediumTest; import com.android.internal.app.ResolverActivity; +import com.android.window.flags.Flags; import org.junit.Before; import org.junit.Test; @@ -693,6 +697,7 @@ public class RootWindowContainerTests extends WindowTestsBase { @Test public void testAwakeFromSleepingWithAppConfiguration() { final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); + display.setIgnoreOrientationRequest(false); final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity.moveFocusableActivityToTop("test"); assertTrue(activity.getRootTask().isFocusedRootTaskOnDisplay()); @@ -1331,6 +1336,38 @@ public class RootWindowContainerTests extends WindowTestsBase { assertEquals(taskDisplayArea.getTopRootTask(), taskDisplayArea.getRootHomeTask()); } + @EnableFlags(Flags.FLAG_ENABLE_TOP_VISIBLE_ROOT_TASK_PER_USER_TRACKING) + @Test + public void testSwitchUser_withVisibleRootTasks_storesAllVisibleRootTasksForCurrentUser() { + // Set up root tasks + final Task rootTask1 = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask( + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final Task rootTask2 = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask( + WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final Task rootTask3 = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask( + WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); + doReturn(rootTask3).when(mRootWindowContainer).getTopDisplayFocusedRootTask(); + + // Set up user ids and visibility + rootTask1.mUserId = mRootWindowContainer.mCurrentUser; + rootTask2.mUserId = mRootWindowContainer.mCurrentUser; + rootTask3.mUserId = mRootWindowContainer.mCurrentUser; + rootTask1.mVisibleRequested = false; + rootTask2.mVisibleRequested = true; + rootTask3.mVisibleRequested = true; + + // Switch to a different user + int currentUser = mRootWindowContainer.mCurrentUser; + int otherUser = currentUser + 1; + mRootWindowContainer.switchUser(otherUser, null); + + // Verify that the previous user persists it's previous visible root tasks + assertArrayEquals( + new int[]{rootTask2.mTaskId, rootTask3.mTaskId}, + mRootWindowContainer.mUserVisibleRootTasks.get(currentUser).toArray() + ); + } + @Test public void testLockAllProfileTasks() { final int profileUid = UserHandle.PER_USER_RANGE + UserHandle.MIN_SECONDARY_USER_ID; diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index bf96f0eb03b8..201ff51f1495 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -107,6 +107,8 @@ import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; +import android.view.DisplayCutout; +import android.view.DisplayInfo; import android.view.InsetsFrameProvider; import android.view.InsetsSource; import android.view.InsetsState; @@ -210,6 +212,37 @@ public class SizeCompatTests extends WindowTestsBase { return setUpApp(builder.build(), appBuilder); } + private void setUpLargeScreenDisplayWithApp(int dw, int dh) { + final DisplayContent display = mDisplayContent; + final DisplayInfo displayInfo = display.getDisplayInfo(); + displayInfo.logicalWidth = dw; + displayInfo.logicalHeight = dh; + // Prevent legacy sdk from being affected by INSETS_DECOUPLED_CONFIGURATION_ENFORCED. + display.mInitialDisplayCutout = displayInfo.displayCutout = DisplayCutout.NO_CUTOUT; + // Smallest screen width=747dp according to 1400/(300/160). + display.mBaseDisplayDensity = displayInfo.logicalDensityDpi = + TestDisplayContent.DEFAULT_LOGICAL_DISPLAY_DENSITY; + doNothing().when(display).updateDisplayInfo(any()); + resizeDisplay(display, displayInfo.logicalWidth, displayInfo.logicalHeight); + assertTrue(display.isLargeScreen()); + if (com.android.window.flags.Flags.universalResizableByDefault()) { + assertTrue("Large screen must ignore orientation request", + display.getIgnoreOrientationRequest()); + } else { + display.setIgnoreOrientationRequest(true); + } + setUpApp(display, null /* appBuilder */); + spyOn(display.getDisplayRotation()); + } + + private void setUpLandscapeLargeScreenDisplayWithApp() { + setUpLargeScreenDisplayWithApp(/* dw */ 2800, /* dh */ 1400); + } + + private void setUpPortraitLargeScreenDisplayWithApp() { + setUpLargeScreenDisplayWithApp(/* dw */ 1400, /* dh */ 2800); + } + @Test public void testHorizontalReachabilityEnabledForTranslucentActivities() { testReachabilityEnabledForTranslucentActivity(/* dw */ 2500, /* dh */1000, @@ -658,9 +691,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testIsLetterboxed_activityFromBubble_returnsFalse() { - setUpDisplaySizeWithApp(1000, 2500); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); - spyOn(mActivity); + setUpPortraitLargeScreenDisplayWithApp(); doReturn(true).when(mActivity).getLaunchedFromBubble(); prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); @@ -1694,10 +1725,9 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testGetLetterboxInnerBounds_noScalingApplied() { // Set up a display in portrait and ignoring orientation request. - final int dw = 1400; - final int dh = 2800; - setUpDisplaySizeWithApp(dw, dh); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpPortraitLargeScreenDisplayWithApp(); + final int dw = mDisplayContent.mBaseDisplayWidth; + final int dh = mDisplayContent.mBaseDisplayHeight; // Rotate display to landscape. rotateDisplay(mActivity.mDisplayContent, ROTATION_90); @@ -1823,8 +1853,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_fixedOrientationAppLaunchedLetterbox() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); // Portrait fixed app without max aspect. prepareUnresizable(mActivity, /* maxAspect= */ 0, SCREEN_ORIENTATION_PORTRAIT); @@ -1852,8 +1881,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_fixedOrientationAppRespectMinAspectRatio() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); // Portrait fixed app with min aspect ratio higher that aspect ratio override for fixed // orientation letterbox. @@ -1884,8 +1912,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_fixedOrientationAppRespectMaxAspectRatio() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); // Portrait fixed app with max aspect ratio lower that aspect ratio override for fixed // orientation letterbox. @@ -1915,8 +1942,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_fixedOrientationAppWithAspectRatioOverride() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); final float fixedOrientationLetterboxAspectRatio = 1.1f; mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio( @@ -2011,8 +2037,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_unresizableWithCorrespondingMinAspectRatio() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); final float fixedOrientationLetterboxAspectRatio = 1.1f; mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio( @@ -2045,13 +2070,10 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testComputeConfigResourceOverrides_unresizableApp() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); - final Rect activityBounds = new Rect(mActivity.getBounds()); - int originalScreenWidthDp = mActivity.getConfiguration().screenWidthDp; int originalScreenHeighthDp = mActivity.getConfiguration().screenHeightDp; @@ -2068,7 +2090,7 @@ public class SizeCompatTests extends WindowTestsBase { // After we rotate, the activity should go in the size-compat mode and report the same // configuration values. - assertDownScaled(); + assertThat(mActivity.inSizeCompatMode()).isTrue(); assertEquals(originalScreenWidthDp, mActivity.getConfiguration().smallestScreenWidthDp); assertEquals(originalScreenWidthDp, mActivity.getConfiguration().screenWidthDp); assertEquals(originalScreenHeighthDp, mActivity.getConfiguration().screenHeightDp); @@ -2087,14 +2109,11 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testComputeConfigResourceOverrides_resizableFixedOrientationActivity() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); // Portrait fixed app without max aspect. prepareLimitedBounds(mActivity, SCREEN_ORIENTATION_PORTRAIT, false /* isUnresizable */); - final Rect activityBounds = new Rect(mActivity.getBounds()); - int originalScreenWidthDp = mActivity.getConfiguration().screenWidthDp; int originalScreenHeighthDp = mActivity.getConfiguration().screenHeightDp; @@ -2206,10 +2225,10 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testSystemFullscreenOverrideForLandscapeDisplay() { - final int displayWidth = 1600; - final int displayHeight = 1400; - setUpDisplaySizeWithApp(displayWidth, displayHeight); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); + final int displayWidth = mDisplayContent.mBaseDisplayWidth; + final int displayHeight = mDisplayContent.mBaseDisplayHeight; + spyOn(mActivity.mAppCompatController.getAppCompatAspectRatioOverrides()); doReturn(true).when( mActivity.mAppCompatController.getAppCompatAspectRatioOverrides()) @@ -2226,10 +2245,10 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testSystemFullscreenOverrideForPortraitDisplay() { - final int displayWidth = 1400; - final int displayHeight = 1600; - setUpDisplaySizeWithApp(displayWidth, displayHeight); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpPortraitLargeScreenDisplayWithApp(); + final int displayWidth = mDisplayContent.mBaseDisplayWidth; + final int displayHeight = mDisplayContent.mBaseDisplayHeight; + spyOn(mActivity.mAppCompatController.getAppCompatAspectRatioOverrides()); doReturn(true).when( mActivity.mAppCompatController.getAppCompatAspectRatioOverrides()) @@ -2619,7 +2638,7 @@ public class SizeCompatTests extends WindowTestsBase { @EnableCompatChanges({ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION}) public void testOverrideRespectRequestedOrientationIsEnabled_orientationIsRespected() { // Set up a display in landscape - setUpDisplaySizeWithApp(2800, 1400); + setUpDisplaySizeWithApp(1000, 500); final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */ false, RESIZE_MODE_UNRESIZEABLE, SCREEN_ORIENTATION_PORTRAIT); @@ -2636,7 +2655,7 @@ public class SizeCompatTests extends WindowTestsBase { @EnableCompatChanges({ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION}) public void testOverrideRespectRequestedOrientationIsEnabled_multiWindow_orientationIgnored() { // Set up a display in landscape - setUpDisplaySizeWithApp(2800, 1400); + setUpDisplaySizeWithApp(1000, 500); final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */ false, RESIZE_MODE_UNRESIZEABLE, SCREEN_ORIENTATION_PORTRAIT); @@ -2655,10 +2674,9 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testSplitAspectRatioForUnresizableLandscapeApps() { // Set up a display in portrait and ignoring orientation request. - int screenWidth = 1400; - int screenHeight = 1600; - setUpDisplaySizeWithApp(screenWidth, screenHeight); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLargeScreenDisplayWithApp(1400, 2400); + final int screenWidth = mDisplayContent.mBaseDisplayWidth; + final int screenHeight = mDisplayContent.mBaseDisplayHeight; mActivity.mWmService.mAppCompatConfiguration .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); @@ -2692,10 +2710,9 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayAspectRatioForResizablePortraitApps() { // Set up a display in portrait and ignoring orientation request. - int displayWidth = 1400; - int displayHeight = 1600; - setUpDisplaySizeWithApp(displayWidth, displayHeight); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLargeScreenDisplayWithApp(1400, 2400); + final int displayWidth = mDisplayContent.mBaseDisplayWidth; + final int displayHeight = mDisplayContent.mBaseDisplayHeight; mWm.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(2f); // Enable display aspect ratio to take precedence before @@ -2728,10 +2745,9 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayAspectRatioForResizableLandscapeApps() { // Set up a display in landscape and ignoring orientation request. - int displayWidth = 1600; - int displayHeight = 1400; - setUpDisplaySizeWithApp(displayWidth, displayHeight); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); + final int displayWidth = mDisplayContent.mBaseDisplayWidth; + final int displayHeight = mDisplayContent.mBaseDisplayHeight; mWm.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(2f); // Enable display aspect ratio to take precedence before @@ -2764,10 +2780,9 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayAspectRatioForUnresizableLandscapeApps() { // Set up a display in portrait and ignoring orientation request. - int displayWidth = 1400; - int displayHeight = 1600; - setUpDisplaySizeWithApp(displayWidth, displayHeight); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpPortraitLargeScreenDisplayWithApp(); + final int displayWidth = mDisplayContent.mBaseDisplayWidth; + final int displayHeight = mDisplayContent.mBaseDisplayHeight; mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f); // Enable display aspect ratio to take precedence before @@ -2791,10 +2806,9 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayAspectRatioForUnresizablePortraitApps() { // Set up a display in landscape and ignoring orientation request. - int displayWidth = 1600; - int displayHeight = 1400; - setUpDisplaySizeWithApp(displayWidth, displayHeight); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); + final int displayWidth = mDisplayContent.mBaseDisplayWidth; + final int displayHeight = mDisplayContent.mBaseDisplayHeight; mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f); // Enable display aspect ratio to take precedence before @@ -2819,8 +2833,7 @@ public class SizeCompatTests extends WindowTestsBase { public void testDisplayIgnoreOrientationRequest_orientationLetterboxBecameSizeCompatAfterRotate() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); @@ -2837,7 +2850,7 @@ public class SizeCompatTests extends WindowTestsBase { // App should be in size compat. assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); - assertDownScaled(); + assertThat(mActivity.inSizeCompatMode()).isTrue(); assertEquals(activityBounds.width(), newActivityBounds.width()); assertEquals(activityBounds.height(), newActivityBounds.height()); assertActivityMaxBoundsSandboxed(); @@ -2846,8 +2859,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_sizeCompatAfterRotate() { // Set up a display in portrait and ignoring orientation request. - setUpDisplaySizeWithApp(1400, 2800); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpPortraitLargeScreenDisplayWithApp(); // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); @@ -2882,9 +2894,8 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_newLaunchedOrientationAppInLetterbox() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); + setUpLandscapeLargeScreenDisplayWithApp(); final DisplayContent display = mActivity.mDisplayContent; - display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); @@ -2928,9 +2939,7 @@ public class SizeCompatTests extends WindowTestsBase { @EnableCompatChanges({ActivityInfo.OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION}) public void testDisplayIgnoreOrientationRequest_orientationChangedToUnspecified() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - final DisplayContent display = mActivity.mDisplayContent; - display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); @@ -2950,9 +2959,8 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_newLaunchedMaxAspectApp() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); + setUpLandscapeLargeScreenDisplayWithApp(); final DisplayContent display = mActivity.mDisplayContent; - display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); @@ -3001,9 +3009,7 @@ public class SizeCompatTests extends WindowTestsBase { @SuppressWarnings("GuardedBy") public void testDisplayIgnoreOrientationRequest_pausedAppNotLostSizeCompat() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - final DisplayContent display = mActivity.mDisplayContent; - display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); // Portrait fixed app. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); @@ -3019,7 +3025,6 @@ public class SizeCompatTests extends WindowTestsBase { // App should be in size compat. assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); - assertDownScaled(); assertThat(mActivity.inSizeCompatMode()).isTrue(); // Activity max bounds are sandboxed due to size compat mode. assertActivityMaxBoundsSandboxed(); @@ -3035,7 +3040,7 @@ public class SizeCompatTests extends WindowTestsBase { verify(scmPolicy, never()).clearSizeCompatMode(); assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); - assertDownScaled(); + assertThat(mActivity.inSizeCompatMode()).isTrue(); assertEquals(activityBounds, mActivity.getBounds()); // Activity max bounds are sandboxed due to size compat. assertActivityMaxBoundsSandboxed(); @@ -3044,9 +3049,8 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testDisplayIgnoreOrientationRequest_rotated180_notInSizeCompat() { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); + setUpLandscapeLargeScreenDisplayWithApp(); final DisplayContent display = mActivity.mDisplayContent; - display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Portrait fixed app. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); @@ -3063,7 +3067,7 @@ public class SizeCompatTests extends WindowTestsBase { // App should be in size compat. assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); - assertDownScaled(); + assertThat(mActivity.inSizeCompatMode()).isTrue(); assertActivityMaxBoundsSandboxed(); // Rotate display to landscape. @@ -3246,8 +3250,9 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testTaskDisplayAreaNotFillDisplay() { - setUpDisplaySizeWithApp(1400, 2800); + setUpPortraitLargeScreenDisplayWithApp(); final DisplayContent display = mActivity.mDisplayContent; + display.setIgnoreOrientationRequest(false); final TaskDisplayArea taskDisplayArea = mActivity.getDisplayArea(); taskDisplayArea.setBounds(0, 0, 1000, 2400); @@ -3430,8 +3435,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testIsHorizontalReachabilityEnabled_splitScreen_false() { mAtm.mDevEnableNonResizableMultiWindow = true; - setUpDisplaySizeWithApp(2800, 1000); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); mWm.mAppCompatConfiguration.setIsHorizontalReachabilityEnabled(true); setUpAllowThinLetterboxed(/* thinLetterboxAllowed */ true); final TestSplitOrganizer organizer = @@ -3518,8 +3522,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testIsHorizontalReachabilityEnabled_emptyBounds_true() { - setUpDisplaySizeWithApp(/* dw */ 2800, /* dh */ 1000); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); mWm.mAppCompatConfiguration.setIsHorizontalReachabilityEnabled(true); setUpAllowThinLetterboxed(/* thinLetterboxAllowed */ true); @@ -3566,8 +3569,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testIsHorizontalReachabilityEnabled_doesNotMatchParentHeight_false() { - setUpDisplaySizeWithApp(2800, 1000); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); mWm.mAppCompatConfiguration.setIsHorizontalReachabilityEnabled(true); setUpAllowThinLetterboxed(/* thinLetterboxAllowed */ true); @@ -3787,12 +3789,10 @@ public class SizeCompatTests extends WindowTestsBase { } private void assertLandscapeActivityAlignedToBottomWithNavbar(boolean immersive) { - final int screenHeight = 2800; - final int screenWidth = 1400; + setUpPortraitLargeScreenDisplayWithApp(); + final int screenHeight = mDisplayContent.mBaseDisplayHeight; + final int screenWidth = mDisplayContent.mBaseDisplayWidth; final int taskbarHeight = 200; - setUpDisplaySizeWithApp(screenWidth, screenHeight); - - mActivity.mDisplayContent.setIgnoreOrientationRequest(true); mActivity.mWmService.mAppCompatConfiguration.setLetterboxVerticalPositionMultiplier(1.0f); final InsetsSource navSource = new InsetsSource( @@ -3972,8 +3972,7 @@ public class SizeCompatTests extends WindowTestsBase { float letterboxHorizontalPositionMultiplier, Rect fixedOrientationLetterbox, Rect sizeCompatUnscaled, Rect sizeCompatScaled) { // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); mActivity.mWmService.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier( letterboxHorizontalPositionMultiplier); @@ -4177,13 +4176,28 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testUpdateResolvedBoundsHorizontalPosition_activityFillParentWidth() { + // Set up a display in landscape and ignoring orientation request. + setUpLandscapeLargeScreenDisplayWithApp(); + prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); + + final Consumer<Float> assertHorizontalPosition = letterboxHorizontalPositionMultiplier -> { + mActivity.mWmService.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier( + letterboxHorizontalPositionMultiplier); + mActivity.recomputeConfiguration(); + assertFitted(); + // Rotate to put activity in size compat mode. + rotateDisplay(mActivity.mDisplayContent, ROTATION_90); + assertTrue(mActivity.inSizeCompatMode()); + // Activity is in size compat mode but not scaled. + assertEquals(new Rect(0, 0, 1400, 700), mActivity.getBounds()); + if (letterboxHorizontalPositionMultiplier < 1f) { + rotateDisplay(mActivity.mDisplayContent, ROTATION_0); + } + }; // When activity width equals parent width, multiplier shouldn't have any effect. - assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity( - /* letterboxHorizontalPositionMultiplier */ 0.0f); - assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity( - /* letterboxHorizontalPositionMultiplier */ 0.5f); - assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity( - /* letterboxHorizontalPositionMultiplier */ 1.0f); + assertHorizontalPosition.accept(0.0f); + assertHorizontalPosition.accept(0.5f); + assertHorizontalPosition.accept(1.0f); } @Test @@ -4354,8 +4368,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testUpdateResolvedBoundsHorizontalPosition_bookModeEnabled() { // Set up a display in landscape with a fixed-orientation PORTRAIT app - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); mWm.mAppCompatConfiguration.setIsAutomaticReachabilityInBookModeEnabled(true); mWm.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier( 1.0f /*letterboxHorizontalPositionMultiplier*/); @@ -4380,8 +4393,7 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testUpdateResolvedBoundsHorizontalPosition_bookModeDisabled_centered() { // Set up a display in landscape with a fixed-orientation PORTRAIT app - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpLandscapeLargeScreenDisplayWithApp(); mWm.mAppCompatConfiguration.setIsAutomaticReachabilityInBookModeEnabled(false); mWm.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier(0.5f); prepareUnresizable(mActivity, 1.75f, SCREEN_ORIENTATION_PORTRAIT); @@ -4462,8 +4474,7 @@ public class SizeCompatTests extends WindowTestsBase { float letterboxVerticalPositionMultiplier, Rect fixedOrientationLetterbox, Rect sizeCompatUnscaled, Rect sizeCompatScaled) { // Set up a display in portrait and ignoring orientation request. - setUpDisplaySizeWithApp(1400, 2800); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + setUpPortraitLargeScreenDisplayWithApp(); mActivity.mWmService.mAppCompatConfiguration.setLetterboxVerticalPositionMultiplier( letterboxVerticalPositionMultiplier); @@ -5036,23 +5047,6 @@ public class SizeCompatTests extends WindowTestsBase { return (dimensionToSplit - (dividerWindowWidth - dividerInsets * 2)) / 2; } - private void assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity( - float letterboxHorizontalPositionMultiplier) { - // Set up a display in landscape and ignoring orientation request. - setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); - - mActivity.mWmService.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier( - letterboxHorizontalPositionMultiplier); - prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); - assertFitted(); - // Rotate to put activity in size compat mode. - rotateDisplay(mActivity.mDisplayContent, ROTATION_90); - assertTrue(mActivity.inSizeCompatMode()); - // Activity is in size compat mode but not scaled. - assertEquals(new Rect(0, 0, 1400, 700), mActivity.getBounds()); - } - private void assertVerticalPositionForDifferentDisplayConfigsForPortraitActivity( float letterboxVerticalPositionMultiplier) { // Set up a display in portrait and ignoring orientation request. diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java index 08622e68629a..921228ff2a5b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java @@ -78,6 +78,8 @@ import android.view.SurfaceControl; import com.android.dx.mockito.inline.extended.StaticMockitoSession; import com.android.internal.os.BackgroundThread; +import com.android.internal.protolog.ProtoLog; +import com.android.internal.protolog.WmProtoLogGroups; import com.android.server.AnimationThread; import com.android.server.DisplayThread; import com.android.server.LocalServices; @@ -183,6 +185,8 @@ public class SystemServicesTestRule implements TestRule { } private void setUp() { + ProtoLog.init(WmProtoLogGroups.values()); + if (mOnBeforeServicesCreated != null) { mOnBeforeServicesCreated.run(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 65a6a69fc45e..dafa96f91812 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -51,6 +51,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.clearInvocations; @@ -62,6 +63,7 @@ import android.content.res.Configuration; import android.graphics.Color; import android.graphics.Rect; import android.os.Binder; +import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; import android.view.View; @@ -1066,6 +1068,98 @@ public class TaskFragmentTest extends WindowTestsBase { Math.min(outConfig.screenWidthDp, outConfig.screenHeightDp)); } + @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) + @Test + public void testSetAdjacentTaskFragments() { + final Task task = createTask(mDisplayContent); + final TaskFragment tf0 = createTaskFragmentWithActivity(task); + final TaskFragment tf1 = createTaskFragmentWithActivity(task); + final TaskFragment tf2 = createTaskFragmentWithActivity(task); + final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); + assertFalse(tf0.hasAdjacentTaskFragment()); + + tf0.setAdjacentTaskFragments(adjacentTfs); + + assertSame(adjacentTfs, tf0.getAdjacentTaskFragments()); + assertSame(adjacentTfs, tf1.getAdjacentTaskFragments()); + assertSame(adjacentTfs, tf2.getAdjacentTaskFragments()); + assertTrue(tf0.hasAdjacentTaskFragment()); + assertTrue(tf1.hasAdjacentTaskFragment()); + assertTrue(tf2.hasAdjacentTaskFragment()); + + final TaskFragment.AdjacentSet adjacentTfs2 = new TaskFragment.AdjacentSet(tf0, tf1); + tf0.setAdjacentTaskFragments(adjacentTfs2); + + assertSame(adjacentTfs2, tf0.getAdjacentTaskFragments()); + assertSame(adjacentTfs2, tf1.getAdjacentTaskFragments()); + assertNull(tf2.getAdjacentTaskFragments()); + assertTrue(tf0.hasAdjacentTaskFragment()); + assertTrue(tf1.hasAdjacentTaskFragment()); + assertFalse(tf2.hasAdjacentTaskFragment()); + } + + @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) + @Test + public void testClearAdjacentTaskFragments() { + final Task task = createTask(mDisplayContent); + final TaskFragment tf0 = createTaskFragmentWithActivity(task); + final TaskFragment tf1 = createTaskFragmentWithActivity(task); + final TaskFragment tf2 = createTaskFragmentWithActivity(task); + final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); + tf0.setAdjacentTaskFragments(adjacentTfs); + + tf0.clearAdjacentTaskFragments(); + + assertNull(tf0.getAdjacentTaskFragments()); + assertNull(tf1.getAdjacentTaskFragments()); + assertNull(tf2.getAdjacentTaskFragments()); + assertFalse(tf0.hasAdjacentTaskFragment()); + assertFalse(tf1.hasAdjacentTaskFragment()); + assertFalse(tf2.hasAdjacentTaskFragment()); + } + + @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) + @Test + public void testRemoveFromAdjacentTaskFragments() { + final Task task = createTask(mDisplayContent); + final TaskFragment tf0 = createTaskFragmentWithActivity(task); + final TaskFragment tf1 = createTaskFragmentWithActivity(task); + final TaskFragment tf2 = createTaskFragmentWithActivity(task); + final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); + tf0.setAdjacentTaskFragments(adjacentTfs); + + tf0.removeFromAdjacentTaskFragments(); + + assertNull(tf0.getAdjacentTaskFragments()); + assertSame(adjacentTfs, tf1.getAdjacentTaskFragments()); + assertSame(adjacentTfs, tf2.getAdjacentTaskFragments()); + assertFalse(adjacentTfs.contains(tf0)); + assertTrue(tf1.isAdjacentTo(tf2)); + assertTrue(tf2.isAdjacentTo(tf1)); + assertFalse(tf1.isAdjacentTo(tf0)); + assertFalse(tf0.isAdjacentTo(tf1)); + assertFalse(tf0.isAdjacentTo(tf0)); + assertFalse(tf1.isAdjacentTo(tf1)); + } + + @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) + @Test + public void testRemoveFromAdjacentTaskFragmentsWhenRemove() { + final Task task = createTask(mDisplayContent); + final TaskFragment tf0 = createTaskFragmentWithActivity(task); + final TaskFragment tf1 = createTaskFragmentWithActivity(task); + final TaskFragment tf2 = createTaskFragmentWithActivity(task); + final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); + tf0.setAdjacentTaskFragments(adjacentTfs); + + tf0.removeImmediately(); + + assertNull(tf0.getAdjacentTaskFragments()); + assertSame(adjacentTfs, tf1.getAdjacentTaskFragments()); + assertSame(adjacentTfs, tf2.getAdjacentTaskFragments()); + assertFalse(adjacentTfs.contains(tf0)); + } + private WindowState createAppWindow(ActivityRecord app, String name) { final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, app, name, 0 /* ownerId */, false /* ownerCanAddInternalSystemWindow */, new TestIWindow()); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java index 29f48b86a375..f145b40d2292 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java @@ -65,33 +65,27 @@ public class TaskSnapshotCacheTest extends TaskSnapshotPersisterTestBase { public void testAppRemoved() { final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window"); mCache.putSnapshot(window.getTask(), createSnapshot()); - assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); mCache.onAppRemoved(window.mActivityRecord); - assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); } @Test public void testAppDied() { final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window"); mCache.putSnapshot(window.getTask(), createSnapshot()); - assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); mCache.onAppDied(window.mActivityRecord); - assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); } @Test public void testTaskRemoved() { final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window"); mCache.putSnapshot(window.getTask(), createSnapshot()); - assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); mCache.onIdRemoved(window.getTask().mTaskId); - assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); } @Test @@ -99,16 +93,14 @@ public class TaskSnapshotCacheTest extends TaskSnapshotPersisterTestBase { final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window"); mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot()); mSnapshotPersistQueue.waitForQueueEmpty(); - assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); // Load it from disk - assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - true /* restoreFromDisk */, true /* isLowResolution */)); + assertNotNull(mCache.getSnapshotFromDisk(window.getTask().mTaskId, mWm.mCurrentUserId, + true /* isLowResolution */, TaskSnapshot.REFERENCE_NONE)); // Make sure it's not in the cache now. - assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); } @Test @@ -116,20 +108,20 @@ public class TaskSnapshotCacheTest extends TaskSnapshotPersisterTestBase { final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window"); mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot()); mSnapshotPersistQueue.waitForQueueEmpty(); - assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); // Load it from disk - assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - true /* restoreFromDisk */, false /* isLowResolution */)); + assertNotNull(mCache.getSnapshotFromDisk(window.getTask().mTaskId, mWm.mCurrentUserId, + false/* isLowResolution */, TaskSnapshot.REFERENCE_NONE)); } @Test public void testClearCache() { final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window"); mCache.putSnapshot(window.getTask(), mSnapshot); - assertEquals(mSnapshot, mCache.getSnapshot(window.getTask().mTaskId, 0, false, false)); + assertEquals(mSnapshot, mCache.getSnapshot(window.getTask().mTaskId, + false /* isLowResolution */)); mCache.clearRunningCache(); - assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0, false, false)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java index 7432537902a0..9bde0663d4a3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java @@ -129,23 +129,20 @@ public class TaskSnapshotLowResDisabledTest extends TaskSnapshotPersisterTestBas final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window"); mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot()); mSnapshotPersistQueue.waitForQueueEmpty(); - assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); // Attempt to load the low-res snapshot from the disk - assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - true /* restoreFromDisk */, true /* isLowResolution */)); + assertNull(mCache.getSnapshotFromDisk(window.getTask().mTaskId, mWm.mCurrentUserId, + true/* isLowResolution */, TaskSnapshot.REFERENCE_NONE)); // Load the high-res (default) snapshot from disk - assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - true /* restoreFromDisk */, false /* isLowResolution */)); + assertNotNull(mCache.getSnapshotFromDisk(window.getTask().mTaskId, mWm.mCurrentUserId, + false /* isLowResolution */, TaskSnapshot.REFERENCE_NONE)); // Make sure it's not in the cache now. - assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - false /* restoreFromDisk */, true /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, true /* isLowResolution */)); // Make sure it's not in the cache now. - assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, - false /* restoreFromDisk */, false /* isLowResolution */)); + assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */)); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index e4512c31069a..1febc9fb4742 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -527,6 +527,7 @@ public class TaskTests extends WindowTestsBase { @Test public void testHandlesOrientationChangeFromDescendant() { + mDisplayContent.setIgnoreOrientationRequest(false); final Task rootTask = createTask(mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD); final Task leafTask1 = createTaskInRootTask(rootTask, 0 /* userId */); @@ -1570,6 +1571,7 @@ public class TaskTests extends WindowTestsBase { @Test public void testNotSpecifyOrientationByFloatingTask() { + mDisplayContent.setIgnoreOrientationRequest(false); final Task task = new TaskBuilder(mSupervisor) .setCreateActivity(true).setCreateParentTask(true).build(); final ActivityRecord activity = task.getTopMostActivity(); @@ -1589,6 +1591,7 @@ public class TaskTests extends WindowTestsBase { @Test public void testNotSpecifyOrientation_taskDisplayAreaNotFocused() { + mDisplayContent.setIgnoreOrientationRequest(false); final TaskDisplayArea firstTaskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea(); final TaskDisplayArea secondTaskDisplayArea = createTaskDisplayArea( mDisplayContent, mRootWindowContainer.mWmService, "TestTaskDisplayArea", @@ -1625,6 +1628,7 @@ public class TaskTests extends WindowTestsBase { @Test public void testTaskOrientationOnDisplayWindowingModeChange() { + mDisplayContent.setIgnoreOrientationRequest(false); // Skip unnecessary operations to speed up the test. mAtm.deferWindowLayout(); final Task task = getTestTask(); diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 039a3ddd3e4f..78f32c1a4f88 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -1333,6 +1333,7 @@ public class TransitionTests extends WindowTestsBase { @Test public void testDeferRotationForTransientLaunch() { + mDisplayContent.setIgnoreOrientationRequest(false); final TestTransitionPlayer player = registerTestTransitionPlayer(); assumeFalse(mDisplayContent.mTransitionController.useShellTransitionsRotation()); final ActivityRecord app = new ActivityBuilder(mAtm).setCreateTask(true).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java index 42752c326615..f1180ff93edb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java @@ -314,6 +314,7 @@ public class TransparentPolicyTest extends WindowTestsBase { runTestScenario((robot) -> { robot.transparentActivity((ta) -> { ta.applyOnActivity((a) -> { + a.setIgnoreOrientationRequest(false); a.applyToTopActivity((topActivity) -> { topActivity.mWmService.mAppCompatConfiguration .setLetterboxHorizontalPositionMultiplier(1.0f); 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 69df66ee783b..8b9849e1fcd8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -1274,7 +1274,6 @@ public class WindowManagerServiceTests extends WindowTestsBase { @Test public void testInputDeviceNotifyConfigurationChanged() { - mSetFlagsRule.enableFlags(Flags.FLAG_FILTER_IRRELEVANT_INPUT_DEVICE_CHANGE); spyOn(mDisplayContent); doReturn(false).when(mDisplayContent).sendNewConfiguration(); final InputDevice deviceA = mock(InputDevice.class); 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 410fa2879600..da4c522834a6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -777,6 +777,7 @@ public class WindowOrganizerTests extends WindowTestsBase { @Test public void testSetIgnoreOrientationRequest_taskDisplayArea() { removeGlobalMinSizeRestriction(); + mDisplayContent.setIgnoreOrientationRequest(false); final TaskDisplayArea taskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea(); final Task rootTask = taskDisplayArea.createRootTask( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */); @@ -815,6 +816,7 @@ public class WindowOrganizerTests extends WindowTestsBase { @Test public void testSetIgnoreOrientationRequest_displayContent() { removeGlobalMinSizeRestriction(); + mDisplayContent.setIgnoreOrientationRequest(false); final TaskDisplayArea taskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea(); final Task rootTask = taskDisplayArea.createRootTask( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */); @@ -924,6 +926,49 @@ public class WindowOrganizerTests extends WindowTestsBase { assertEquals(dc.getDefaultTaskDisplayArea().mLaunchAdjacentFlagRootTask, null); } + @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) + @Test + public void testSetAdjacentLaunchRootSet() { + final DisplayContent dc = mWm.mRoot.getDisplayContent(Display.DEFAULT_DISPLAY); + + final Task task1 = mWm.mAtmService.mTaskOrganizerController.createRootTask( + dc, WINDOWING_MODE_MULTI_WINDOW, null); + final RunningTaskInfo info1 = task1.getTaskInfo(); + final Task task2 = mWm.mAtmService.mTaskOrganizerController.createRootTask( + dc, WINDOWING_MODE_MULTI_WINDOW, null); + final RunningTaskInfo info2 = task2.getTaskInfo(); + final Task task3 = mWm.mAtmService.mTaskOrganizerController.createRootTask( + dc, WINDOWING_MODE_MULTI_WINDOW, null); + final RunningTaskInfo info3 = task3.getTaskInfo(); + + WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.setAdjacentRootSet(info1.token, info2.token, info3.token); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + assertTrue(task1.hasAdjacentTaskFragment()); + assertTrue(task2.hasAdjacentTaskFragment()); + assertTrue(task3.hasAdjacentTaskFragment()); + assertTrue(task1.isAdjacentTo(task2)); + assertTrue(task1.isAdjacentTo(task3)); + assertTrue(task2.isAdjacentTo(task3)); + + wct = new WindowContainerTransaction(); + wct.clearAdjacentRoots(info1.token); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + assertFalse(task1.hasAdjacentTaskFragment()); + assertTrue(task2.hasAdjacentTaskFragment()); + assertTrue(task3.hasAdjacentTaskFragment()); + assertFalse(task1.isAdjacentTo(task2)); + assertFalse(task1.isAdjacentTo(task3)); + assertTrue(task2.isAdjacentTo(task3)); + + wct = new WindowContainerTransaction(); + wct.clearAdjacentRoots(info2.token); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + assertFalse(task2.hasAdjacentTaskFragment()); + assertFalse(task3.hasAdjacentTaskFragment()); + assertFalse(task2.isAdjacentTo(task3)); + } + @Test public void testTileAddRemoveChild() { final StubOrganizer listener = new StubOrganizer(); 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 3a97cc621e0d..b27025c34d6b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -201,14 +201,10 @@ public class WindowTestsBase extends SystemServiceTestsBase { * {@link WindowTestsBase#setUpBase()}. */ private static boolean sGlobalOverridesChecked; + /** * Whether device-specific overrides have already been checked in - * {@link WindowTestsBase#setUpBase()} when the default display is used. - */ - private static boolean sOverridesCheckedDefaultDisplay; - /** - * Whether device-specific overrides have already been checked in - * {@link WindowTestsBase#setUpBase()} when a {@link TestDisplayContent} is used. + * {@link WindowTestsBase#setUpBase()}. */ private static boolean sOverridesCheckedTestDisplay; @@ -332,17 +328,14 @@ public class WindowTestsBase extends SystemServiceTestsBase { private void checkDeviceSpecificOverridesNotApplied() { // Check global overrides if (!sGlobalOverridesChecked) { + sGlobalOverridesChecked = true; assertEquals(0, mWm.mAppCompatConfiguration.getFixedOrientationLetterboxAspectRatio(), 0 /* delta */); - sGlobalOverridesChecked = true; } // Check display-specific overrides - if (!sOverridesCheckedDefaultDisplay && mDisplayContent == mDefaultDisplay) { - assertFalse(mDisplayContent.getIgnoreOrientationRequest()); - sOverridesCheckedDefaultDisplay = true; - } else if (!sOverridesCheckedTestDisplay && mDisplayContent instanceof TestDisplayContent) { - assertFalse(mDisplayContent.getIgnoreOrientationRequest()); + if (!sOverridesCheckedTestDisplay) { sOverridesCheckedTestDisplay = true; + assertFalse(mDisplayContent.mHasSetIgnoreOrientationRequest); } } @@ -1121,7 +1114,7 @@ public class WindowTestsBase extends SystemServiceTestsBase { displayContent.getDisplayRotation().configure(width, height); final Configuration c = new Configuration(); displayContent.computeScreenConfiguration(c); - displayContent.onRequestedOverrideConfigurationChanged(c); + displayContent.performDisplayOverrideConfigUpdate(c); } static void makeDisplayLargeScreen(DisplayContent displayContent) { diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 15c8b135d2c4..c65f7844f201 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -70,6 +70,7 @@ import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; +import android.os.SELinux; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UEventObserver; @@ -161,6 +162,11 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser private static final String MIDI_ALSA_PATH = "/sys/class/android_usb/android0/f_midi/alsa"; + /** + * The minimum SELinux genfs labels version that supports udc sysfs genfs context. + */ + private static final int MIN_SELINUX_GENFS_LABELS_VERSION = 202404; + private static final int MSG_UPDATE_STATE = 0; private static final int MSG_ENABLE_ADB = 1; private static final int MSG_SET_CURRENT_FUNCTIONS = 2; @@ -445,7 +451,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser mEnableUdcSysfsUsbStateUpdate = android.hardware.usb.flags.Flags.enableUdcSysfsUsbStateUpdate() - && context.getResources().getBoolean(R.bool.config_enableUdcSysfsUsbStateUpdate); + && context.getResources().getBoolean(R.bool.config_enableUdcSysfsUsbStateUpdate) + && SELinux.getGenfsLabelsVersion() > MIN_SELINUX_GENFS_LABELS_VERSION; if (mEnableUdcSysfsUsbStateUpdate) { mUEventObserver.startObserving(UDC_SUBSYS_MATCH); diff --git a/telephony/java/android/telephony/Annotation.java b/telephony/java/android/telephony/Annotation.java index 09b18b65be4a..8fe107cc1ad3 100644 --- a/telephony/java/android/telephony/Annotation.java +++ b/telephony/java/android/telephony/Annotation.java @@ -109,7 +109,6 @@ public class Annotation { //TelephonyManager.NETWORK_TYPE_LTE_CA, TelephonyManager.NETWORK_TYPE_NR, - TelephonyManager.NETWORK_TYPE_NB_IOT_NTN, }) @Retention(RetentionPolicy.SOURCE) public @interface NetworkType { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 478ec5c62bc6..fa4ec1692b0e 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -9988,6 +9988,19 @@ public class CarrierConfigManager { "satellite_data_support_mode_int"; /** + * Determines whether data roaming off setting should be ignored and satellite data should be + * allowed even when data roaming is off. + * + * If the carrier would like to allow the device to use satellite connection when data roaming + * is off, this key should be set to {@code true}. + * + * The default value is {@code false} i.e. disallow satellite data when data roaming is off. + */ + @FlaggedApi(Flags.FLAG_SATELLITE_25Q4_APIS) + public static final String KEY_SATELLITE_IGNORE_DATA_ROAMING_SETTING_BOOL = + "satellite_ignore_data_roaming_setting_bool"; + + /** * Determine whether to override roaming Wi-Fi Calling preference when device is connected to * non-terrestrial network. * {@code true} - roaming preference cannot be changed by user independently. @@ -11388,6 +11401,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true); sDefaults.putInt(KEY_SATELLITE_DATA_SUPPORT_MODE_INT, CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED); + sDefaults.putBoolean(KEY_SATELLITE_IGNORE_DATA_ROAMING_SETTING_BOOL, false); sDefaults.putBoolean(KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL, true); sDefaults.putInt(KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT, 7); sDefaults.putBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false); diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java index 4e5a246ef773..4cb622b3eb9e 100644 --- a/telephony/java/android/telephony/CellIdentityCdma.java +++ b/telephony/java/android/telephony/CellIdentityCdma.java @@ -105,20 +105,30 @@ public final class CellIdentityCdma extends CellIdentity { */ public CellIdentityCdma(int nid, int sid, int bid, int lon, int lat, @Nullable String alphal, @Nullable String alphas) { - super(TAG, CellInfo.TYPE_CDMA, null, null, alphal, alphas); - mNetworkId = inRangeOrUnavailable(nid, 0, NETWORK_ID_MAX); - mSystemId = inRangeOrUnavailable(sid, 0, SYSTEM_ID_MAX); - mBasestationId = inRangeOrUnavailable(bid, 0, BASESTATION_ID_MAX); - lat = inRangeOrUnavailable(lat, LATITUDE_MIN, LATITUDE_MAX); - lon = inRangeOrUnavailable(lon, LONGITUDE_MIN, LONGITUDE_MAX); - - if (!isNullIsland(lat, lon)) { - mLongitude = lon; - mLatitude = lat; + super(TAG, CellInfo.TYPE_CDMA, null, null, Flags.cleanupCdma() ? null : alphal, + Flags.cleanupCdma() ? null : alphas); + if (Flags.cleanupCdma()) { + mNetworkId = CellInfo.UNAVAILABLE; + mSystemId = CellInfo.UNAVAILABLE; + mBasestationId = CellInfo.UNAVAILABLE; + mLongitude = CellInfo.UNAVAILABLE; + mLatitude = CellInfo.UNAVAILABLE; + mGlobalCellId = null; } else { - mLongitude = mLatitude = CellInfo.UNAVAILABLE; + mNetworkId = inRangeOrUnavailable(nid, 0, NETWORK_ID_MAX); + mSystemId = inRangeOrUnavailable(sid, 0, SYSTEM_ID_MAX); + mBasestationId = inRangeOrUnavailable(bid, 0, BASESTATION_ID_MAX); + lat = inRangeOrUnavailable(lat, LATITUDE_MIN, LATITUDE_MAX); + lon = inRangeOrUnavailable(lon, LONGITUDE_MIN, LONGITUDE_MAX); + + if (!isNullIsland(lat, lon)) { + mLongitude = lon; + mLatitude = lat; + } else { + mLongitude = mLatitude = CellInfo.UNAVAILABLE; + } + updateGlobalCellId(); } - updateGlobalCellId(); } private CellIdentityCdma(@NonNull CellIdentityCdma cid) { @@ -300,14 +310,34 @@ public final class CellIdentityCdma extends CellIdentity { /** Construct from Parcel, type has already been processed */ private CellIdentityCdma(Parcel in) { super(TAG, CellInfo.TYPE_CDMA, in); - mNetworkId = in.readInt(); - mSystemId = in.readInt(); - mBasestationId = in.readInt(); - mLongitude = in.readInt(); - mLatitude = in.readInt(); - - updateGlobalCellId(); - if (DBG) log(toString()); + + if (Flags.cleanupCdma()) { + in.readInt(); + mNetworkId = CellInfo.UNAVAILABLE; + + in.readInt(); + mSystemId = CellInfo.UNAVAILABLE; + + in.readInt(); + mBasestationId = CellInfo.UNAVAILABLE; + + in.readInt(); + mLongitude = CellInfo.UNAVAILABLE; + + in.readInt(); + mLatitude = CellInfo.UNAVAILABLE; + + mGlobalCellId = null; + } else { + mNetworkId = in.readInt(); + mSystemId = in.readInt(); + mBasestationId = in.readInt(); + mLongitude = in.readInt(); + mLatitude = in.readInt(); + + updateGlobalCellId(); + if (DBG) log(toString()); + } } /** diff --git a/telephony/java/android/telephony/CellSignalStrengthCdma.java b/telephony/java/android/telephony/CellSignalStrengthCdma.java index 5298e67bdf80..12a7294c42de 100644 --- a/telephony/java/android/telephony/CellSignalStrengthCdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthCdma.java @@ -21,6 +21,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; +import com.android.internal.telephony.flags.Flags; import com.android.telephony.Rlog; import java.util.Objects; @@ -68,13 +69,17 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements */ public CellSignalStrengthCdma(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr) { - mCdmaDbm = inRangeOrUnavailable(cdmaDbm, -120, 0); - mCdmaEcio = inRangeOrUnavailable(cdmaEcio, -160, 0); - mEvdoDbm = inRangeOrUnavailable(evdoDbm, -120, 0); - mEvdoEcio = inRangeOrUnavailable(evdoEcio, -160, 0); - mEvdoSnr = inRangeOrUnavailable(evdoSnr, 0, 8); + if (Flags.cleanupCdma()) { + setDefaultValues(); + } else { + mCdmaDbm = inRangeOrUnavailable(cdmaDbm, -120, 0); + mCdmaEcio = inRangeOrUnavailable(cdmaEcio, -160, 0); + mEvdoDbm = inRangeOrUnavailable(evdoDbm, -120, 0); + mEvdoEcio = inRangeOrUnavailable(evdoEcio, -160, 0); + mEvdoSnr = inRangeOrUnavailable(evdoSnr, 0, 8); - updateLevel(null, null); + updateLevel(null, null); + } } /** @hide */ @@ -84,6 +89,10 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements /** @hide */ protected void copyFrom(CellSignalStrengthCdma s) { + if (Flags.cleanupCdma()) { + setDefaultValues(); + return; + } mCdmaDbm = s.mCdmaDbm; mCdmaEcio = s.mCdmaEcio; mEvdoDbm = s.mEvdoDbm; @@ -389,6 +398,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements /** @hide */ @Override public boolean isValid() { + if (Flags.cleanupCdma()) return false; return !this.equals(sInvalid); } @@ -446,7 +456,12 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements mEvdoEcio = in.readInt(); mEvdoSnr = in.readInt(); mLevel = in.readInt(); - if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString()); + + if (Flags.cleanupCdma()) { + setDefaultValues(); + } else { + if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString()); + } } /** Implement the Parcelable interface */ diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java index 8b52f07102b8..90d6f89553b7 100644 --- a/telephony/java/android/telephony/RadioAccessFamily.java +++ b/telephony/java/android/telephony/RadioAccessFamily.java @@ -66,9 +66,6 @@ public class RadioAccessFamily implements Parcelable { // 5G public static final int RAF_NR = (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR; - /** NB-IOT (Narrowband Internet of Things) over Non-Terrestrial-Networks technology. */ - public static final int RAF_NB_IOT_NTN = (int) TelephonyManager.NETWORK_TYPE_BITMASK_NB_IOT_NTN; - // Grouping of RAFs // 2G private static final int GSM = RAF_GSM | RAF_GPRS | RAF_EDGE; @@ -83,9 +80,6 @@ public class RadioAccessFamily implements Parcelable { // 5G private static final int NR = RAF_NR; - /** Non-Terrestrial Network. */ - private static final int NB_IOT_NTN = RAF_NB_IOT_NTN; - /* Phone ID of phone */ private int mPhoneId; @@ -264,7 +258,7 @@ public class RadioAccessFamily implements Parcelable { raf = ((EVDO & raf) > 0) ? (EVDO | raf) : raf; raf = ((LTE & raf) > 0) ? (LTE | raf) : raf; raf = ((NR & raf) > 0) ? (NR | raf) : raf; - raf = ((NB_IOT_NTN & raf) > 0) ? (NB_IOT_NTN | raf) : raf; + return raf; } @@ -370,7 +364,6 @@ public class RadioAccessFamily implements Parcelable { case "WCDMA": return WCDMA; case "LTE_CA": return RAF_LTE_CA; case "NR": return RAF_NR; - case "NB_IOT_NTN": return RAF_NB_IOT_NTN; default: return RAF_UNKNOWN; } } diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index f8c3287fec36..127bbff01575 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -233,12 +233,6 @@ public class ServiceState implements Parcelable { public static final int RIL_RADIO_TECHNOLOGY_NR = 20; /** - * 3GPP NB-IOT (Narrowband Internet of Things) over Non-Terrestrial-Networks technology. - * @hide - */ - public static final int RIL_RADIO_TECHNOLOGY_NB_IOT_NTN = 21; - - /** * RIL Radio Annotation * @hide */ @@ -264,16 +258,14 @@ public class ServiceState implements Parcelable { ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA, ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN, ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA, - ServiceState.RIL_RADIO_TECHNOLOGY_NR, - ServiceState.RIL_RADIO_TECHNOLOGY_NB_IOT_NTN - }) + ServiceState.RIL_RADIO_TECHNOLOGY_NR}) public @interface RilRadioTechnology {} /** * The number of the radio technologies. */ - private static final int NEXT_RIL_RADIO_TECHNOLOGY = 22; + private static final int NEXT_RIL_RADIO_TECHNOLOGY = 21; /** @hide */ public static final int RIL_RADIO_CDMA_TECHNOLOGY_BITMASK = @@ -1133,9 +1125,6 @@ public class ServiceState implements Parcelable { case RIL_RADIO_TECHNOLOGY_NR: rtString = "NR_SA"; break; - case RIL_RADIO_TECHNOLOGY_NB_IOT_NTN: - rtString = "NB_IOT_NTN"; - break; default: rtString = "Unexpected"; Rlog.w(LOG_TAG, "Unexpected radioTechnology=" + rt); @@ -1679,8 +1668,6 @@ public class ServiceState implements Parcelable { return TelephonyManager.NETWORK_TYPE_LTE_CA; case RIL_RADIO_TECHNOLOGY_NR: return TelephonyManager.NETWORK_TYPE_NR; - case RIL_RADIO_TECHNOLOGY_NB_IOT_NTN: - return TelephonyManager.NETWORK_TYPE_NB_IOT_NTN; default: return TelephonyManager.NETWORK_TYPE_UNKNOWN; } @@ -1710,7 +1697,6 @@ public class ServiceState implements Parcelable { return AccessNetworkType.CDMA2000; case RIL_RADIO_TECHNOLOGY_LTE: case RIL_RADIO_TECHNOLOGY_LTE_CA: - case RIL_RADIO_TECHNOLOGY_NB_IOT_NTN: return AccessNetworkType.EUTRAN; case RIL_RADIO_TECHNOLOGY_NR: return AccessNetworkType.NGRAN; @@ -1771,8 +1757,6 @@ public class ServiceState implements Parcelable { return RIL_RADIO_TECHNOLOGY_LTE_CA; case TelephonyManager.NETWORK_TYPE_NR: return RIL_RADIO_TECHNOLOGY_NR; - case TelephonyManager.NETWORK_TYPE_NB_IOT_NTN: - return RIL_RADIO_TECHNOLOGY_NB_IOT_NTN; default: return RIL_RADIO_TECHNOLOGY_UNKNOWN; } @@ -1882,8 +1866,7 @@ public class ServiceState implements Parcelable { || radioTechnology == RIL_RADIO_TECHNOLOGY_TD_SCDMA || radioTechnology == RIL_RADIO_TECHNOLOGY_IWLAN || radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA - || radioTechnology == RIL_RADIO_TECHNOLOGY_NR - || radioTechnology == RIL_RADIO_TECHNOLOGY_NB_IOT_NTN; + || radioTechnology == RIL_RADIO_TECHNOLOGY_NR; } @@ -1903,8 +1886,7 @@ public class ServiceState implements Parcelable { public static boolean isPsOnlyTech(int radioTechnology) { return radioTechnology == RIL_RADIO_TECHNOLOGY_LTE || radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA - || radioTechnology == RIL_RADIO_TECHNOLOGY_NR - || radioTechnology == RIL_RADIO_TECHNOLOGY_NB_IOT_NTN; + || radioTechnology == RIL_RADIO_TECHNOLOGY_NR; } /** @hide */ diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 698821bc8890..24fb8c5da2d7 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -2455,6 +2455,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public String getMeid() { + if (Flags.cleanupCdma()) return null; return getMeid(getSlotIndex()); } @@ -2500,6 +2501,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public String getMeid(int slotIndex) { + if (Flags.cleanupCdma()) return null; ITelephony telephony = getITelephony(); if (telephony == null) return null; @@ -2531,6 +2533,7 @@ public class TelephonyManager { @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) @Nullable public String getManufacturerCode() { + if (Flags.cleanupCdma()) return null; return getManufacturerCode(getSlotIndex()); } @@ -2549,6 +2552,7 @@ public class TelephonyManager { @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) @Nullable public String getManufacturerCode(int slotIndex) { + if (Flags.cleanupCdma()) return null; ITelephony telephony = getITelephony(); if (telephony == null) return null; @@ -3193,12 +3197,6 @@ public class TelephonyManager { * For 5G NSA, the network type will be {@link #NETWORK_TYPE_LTE}. */ public static final int NETWORK_TYPE_NR = TelephonyProtoEnums.NETWORK_TYPE_NR; // 20. - /** - * 3GPP NB-IOT (Narrowband Internet of Things) over Non-Terrestrial-Networks technology. - */ - @FlaggedApi(Flags.FLAG_SATELLITE_SYSTEM_APIS) - public static final int NETWORK_TYPE_NB_IOT_NTN = - TelephonyProtoEnums.NETWORK_TYPE_NB_IOT_NTN; // 21 private static final @NetworkType int[] NETWORK_TYPES = { NETWORK_TYPE_GPRS, @@ -3275,7 +3273,6 @@ public class TelephonyManager { * @see #NETWORK_TYPE_EHRPD * @see #NETWORK_TYPE_HSPAP * @see #NETWORK_TYPE_NR - * @see #NETWORK_TYPE_NB_IOT_NTN * * @hide */ @@ -3336,7 +3333,6 @@ public class TelephonyManager { * @see #NETWORK_TYPE_EHRPD * @see #NETWORK_TYPE_HSPAP * @see #NETWORK_TYPE_NR - * @see #NETWORK_TYPE_NB_IOT_NTN * * @throws UnsupportedOperationException If the device does not have * {@link PackageManager#FEATURE_TELEPHONY_RADIO_ACCESS}. @@ -3487,8 +3483,6 @@ public class TelephonyManager { return "LTE_CA"; case NETWORK_TYPE_NR: return "NR"; - case NETWORK_TYPE_NB_IOT_NTN: - return "NB_IOT_NTN"; case NETWORK_TYPE_UNKNOWN: return "UNKNOWN"; default: @@ -3539,8 +3533,6 @@ public class TelephonyManager { return NETWORK_TYPE_BITMASK_LTE; case NETWORK_TYPE_NR: return NETWORK_TYPE_BITMASK_NR; - case NETWORK_TYPE_NB_IOT_NTN: - return NETWORK_TYPE_BITMASK_NB_IOT_NTN; case NETWORK_TYPE_IWLAN: return NETWORK_TYPE_BITMASK_IWLAN; case NETWORK_TYPE_IDEN: @@ -6383,6 +6375,7 @@ public class TelephonyManager { * @deprecated use {@link #getImsPrivateUserIdentity()} */ @UnsupportedAppUsage + @Deprecated public String getIsimImpi() { try { IPhoneSubInfo info = getSubscriberInfoService(); @@ -6472,6 +6465,7 @@ public class TelephonyManager { * @deprecated use {@link #getImsPublicUserIdentities()} */ @UnsupportedAppUsage + @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String[] getIsimImpu() { @@ -6942,6 +6936,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public @EriIconIndex int getCdmaEnhancedRoamingIndicatorDisplayNumber() { + if (Flags.cleanupCdma()) return -1; return getCdmaEriIconIndex(getSubId()); } @@ -6954,6 +6949,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @UnsupportedAppUsage public @EriIconIndex int getCdmaEriIconIndex(int subId) { + if (Flags.cleanupCdma()) return -1; try { ITelephony telephony = getITelephony(); if (telephony == null) @@ -6980,6 +6976,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @UnsupportedAppUsage public @EriIconMode int getCdmaEriIconMode(int subId) { + if (Flags.cleanupCdma()) return -1; try { ITelephony telephony = getITelephony(); if (telephony == null) @@ -7003,6 +7000,7 @@ public class TelephonyManager { @Deprecated @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getCdmaEriText() { + if (Flags.cleanupCdma()) return null; return getCdmaEriText(getSubId()); } @@ -7016,6 +7014,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @UnsupportedAppUsage public String getCdmaEriText(int subId) { + if (Flags.cleanupCdma()) return null; try { ITelephony telephony = getITelephony(); if (telephony == null) @@ -8295,6 +8294,7 @@ public class TelephonyManager { @Deprecated @UnsupportedAppUsage public String nvReadItem(int itemID) { + if (Flags.cleanupCdma()) return ""; try { ITelephony telephony = getITelephony(); if (telephony != null) @@ -8324,6 +8324,7 @@ public class TelephonyManager { */ @Deprecated public boolean nvWriteItem(int itemID, String itemValue) { + if (Flags.cleanupCdma()) return false; try { ITelephony telephony = getITelephony(); if (telephony != null) @@ -8352,6 +8353,7 @@ public class TelephonyManager { */ @Deprecated public boolean nvWriteCdmaPrl(byte[] preferredRoamingList) { + if (Flags.cleanupCdma()) return false; try { ITelephony telephony = getITelephony(); if (telephony != null) @@ -8498,7 +8500,9 @@ public class TelephonyManager { if (telephony == null) { throw new IllegalStateException("telephony service is null."); } - telephony.rebootModem(getSlotIndex()); + if (!telephony.rebootModem(getSlotIndex())) { + throw new RuntimeException("Couldn't reboot modem (it may be not supported)"); + } } catch (RemoteException ex) { Rlog.e(TAG, "rebootRadio RemoteException", ex); throw ex.rethrowAsRuntimeException(); @@ -10323,9 +10327,6 @@ public class TelephonyManager { * This API will result in allowing an intersection of allowed network types for all reasons, * including the configuration done through other reasons. * - * If device supports satellite service, then - * {@link #NETWORK_TYPE_NB_IOT_NTN} is added to allowed network types for reason by default. - * * @param reason the reason the allowed network type change is taking place * @param allowedNetworkTypes The bitmask of allowed network type * @throws IllegalStateException if the Telephony process is not currently available. @@ -10375,10 +10376,6 @@ public class TelephonyManager { * <p>Requires permission: android.Manifest.READ_PRIVILEGED_PHONE_STATE or * that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * - * If device supports satellite service, then - * {@link #NETWORK_TYPE_NB_IOT_NTN} is added to allowed network types for reason by - * default. - * * @param reason the reason the allowed network type change is taking place * @return the allowed network type bitmask * @throws IllegalStateException if the Telephony process is not currently available. @@ -10445,7 +10442,7 @@ public class TelephonyManager { */ public static String convertNetworkTypeBitmaskToString( @NetworkTypeBitMask long networkTypeBitmask) { - String networkTypeName = IntStream.rangeClosed(NETWORK_TYPE_GPRS, NETWORK_TYPE_NB_IOT_NTN) + String networkTypeName = IntStream.rangeClosed(NETWORK_TYPE_GPRS, NETWORK_TYPE_NR) .filter(x -> { return (networkTypeBitmask & getBitMaskForNetworkType(x)) == getBitMaskForNetworkType(x); @@ -10712,6 +10709,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public String getCdmaMdn() { + if (Flags.cleanupCdma()) return null; return getCdmaMdn(getSubId()); } @@ -10727,6 +10725,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public String getCdmaMdn(int subId) { + if (Flags.cleanupCdma()) return null; try { ITelephony telephony = getITelephony(); if (telephony == null) @@ -10751,6 +10750,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public String getCdmaMin() { + if (Flags.cleanupCdma()) return null; return getCdmaMin(getSubId()); } @@ -10766,6 +10766,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public String getCdmaMin(int subId) { + if (Flags.cleanupCdma()) return null; try { ITelephony telephony = getITelephony(); if (telephony == null) @@ -12059,6 +12060,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public @CdmaRoamingMode int getCdmaRoamingMode() { + if (Flags.cleanupCdma()) return CDMA_ROAMING_MODE_RADIO_DEFAULT; int mode = CDMA_ROAMING_MODE_RADIO_DEFAULT; try { ITelephony telephony = getITelephony(); @@ -12106,6 +12108,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public void setCdmaRoamingMode(@CdmaRoamingMode int mode) { + if (Flags.cleanupCdma()) return; if (getPhoneType() != PHONE_TYPE_CDMA) { throw new IllegalStateException("Phone does not support CDMA."); } @@ -12191,6 +12194,7 @@ public class TelephonyManager { @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public @CdmaSubscription int getCdmaSubscriptionMode() { + if (Flags.cleanupCdma()) return CDMA_SUBSCRIPTION_UNKNOWN; int mode = CDMA_SUBSCRIPTION_RUIM_SIM; try { ITelephony telephony = getITelephony(); @@ -12234,6 +12238,7 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public void setCdmaSubscriptionMode(@CdmaSubscription int mode) { + if (Flags.cleanupCdma()) return; if (getPhoneType() != PHONE_TYPE_CDMA) { throw new IllegalStateException("Phone does not support CDMA."); } @@ -13961,6 +13966,7 @@ public class TelephonyManager { @SystemApi @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CDMA) public String getCdmaPrlVersion() { + if (Flags.cleanupCdma()) return null; return getCdmaPrlVersion(getSubId()); } @@ -13976,6 +13982,7 @@ public class TelephonyManager { */ @Deprecated public String getCdmaPrlVersion(int subId) { + if (Flags.cleanupCdma()) return null; try { ITelephony service = getITelephony(); if (service != null) { @@ -14029,6 +14036,7 @@ public class TelephonyManager { * @hide */ @SystemApi + @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresFeature(PackageManager.FEATURE_TELEPHONY_CARRIERLOCK) public int setAllowedCarriers(int slotIndex, List<CarrierIdentifier> carriers) { @@ -15116,8 +15124,7 @@ public class TelephonyManager { NETWORK_TYPE_BITMASK_LTE_CA, NETWORK_TYPE_BITMASK_NR, NETWORK_TYPE_BITMASK_IWLAN, - NETWORK_TYPE_BITMASK_IDEN, - NETWORK_TYPE_BITMASK_NB_IOT_NTN + NETWORK_TYPE_BITMASK_IDEN }) public @interface NetworkTypeBitMask {} @@ -15224,12 +15231,6 @@ public class TelephonyManager { */ public static final long NETWORK_TYPE_BITMASK_IWLAN = (1 << (NETWORK_TYPE_IWLAN -1)); - /** - * network type bitmask indicating the support of readio tech NB IOT NTN. - */ - @FlaggedApi(Flags.FLAG_SATELLITE_SYSTEM_APIS) - public static final long NETWORK_TYPE_BITMASK_NB_IOT_NTN = (1 << (NETWORK_TYPE_NB_IOT_NTN - 1)); - /** @hide */ public static final long NETWORK_CLASS_BITMASK_2G = NETWORK_TYPE_BITMASK_GSM | NETWORK_TYPE_BITMASK_GPRS @@ -15258,9 +15259,6 @@ public class TelephonyManager { public static final long NETWORK_CLASS_BITMASK_5G = NETWORK_TYPE_BITMASK_NR; /** @hide */ - public static final long NETWORK_CLASS_BITMASK_NTN = NETWORK_TYPE_BITMASK_NB_IOT_NTN; - - /** @hide */ public static final long NETWORK_STANDARDS_FAMILY_BITMASK_3GPP = NETWORK_TYPE_BITMASK_GSM | NETWORK_TYPE_BITMASK_GPRS | NETWORK_TYPE_BITMASK_EDGE @@ -15272,8 +15270,7 @@ public class TelephonyManager { | NETWORK_TYPE_BITMASK_TD_SCDMA | NETWORK_TYPE_BITMASK_LTE | NETWORK_TYPE_BITMASK_LTE_CA - | NETWORK_TYPE_BITMASK_NR - | NETWORK_TYPE_BITMASK_NB_IOT_NTN; + | NETWORK_TYPE_BITMASK_NR; /** @hide * @deprecated Legacy CDMA is unsupported. @@ -18314,7 +18311,7 @@ public class TelephonyManager { */ public static boolean isNetworkTypeValid(@NetworkType int networkType) { return networkType >= TelephonyManager.NETWORK_TYPE_UNKNOWN && - networkType <= TelephonyManager.NETWORK_TYPE_NB_IOT_NTN; + networkType <= TelephonyManager.NETWORK_TYPE_NR; } /** diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java index 0f23f337d851..cf807a295a2d 100644 --- a/telephony/java/android/telephony/satellite/SatelliteManager.java +++ b/telephony/java/android/telephony/satellite/SatelliteManager.java @@ -2574,6 +2574,8 @@ public final class SatelliteManager { * @param executor The executor on which the callback will be called. * @param callback The callback to handle the selected satellite subscription changed event. * + * @return The {@link SatelliteResult} result of the operation. + * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. * @@ -3301,7 +3303,7 @@ public final class SatelliteManager { * @param executor The executor on which the callback will be called. * @param callback The callback to handle the satellite supoprted state changed event. * - * @return The result of the operation. + * @return The {@link SatelliteResult} result of the operation. * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. @@ -3383,7 +3385,7 @@ public final class SatelliteManager { * * @param executor The executor on which the callback will be called. * @param callback The callback to handle satellite communication allowed state changed event. - * @return The result of the operation. + * @return The {@link SatelliteResult} result of the operation. * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. * @hide @@ -3621,8 +3623,6 @@ public final class SatelliteManager { * @throws IllegalStateException if the Telephony process is not currently available. * @hide */ - @SystemApi - @FlaggedApi(Flags.FLAG_SATELLITE_SYSTEM_APIS) @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) public void requestSatelliteDisplayName( @NonNull @CallbackExecutor Executor executor, diff --git a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java index eaeed2a0a9fa..b1a5b1bebc59 100644 --- a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java +++ b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java @@ -17,6 +17,7 @@ package android.telephony.satellite.stub; import android.annotation.NonNull; +import android.hardware.radio.network.IRadioNetwork; import android.os.IBinder; import android.os.RemoteException; import android.telephony.IBooleanConsumer; @@ -586,7 +587,11 @@ public class SatelliteImplBase extends SatelliteService { * SatelliteResult:SATELLITE_RESULT_NO_RESOURCES * SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE * SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED + * + * @deprecated Use + * {@link IRadioNetwork#setSatellitePlmn(int, int, String[], String[])}. */ + @Deprecated public void setSatellitePlmn(@NonNull int simLogicalSlotIndex, @NonNull List<String> carrierPlmnList, @NonNull List<String> allSatellitePlmnList, @NonNull IIntegerConsumer resultCallback) { @@ -608,7 +613,11 @@ public class SatelliteImplBase extends SatelliteService { * SatelliteResult:SATELLITE_RESULT_MODEM_ERROR * SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE * SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED + * + * @deprecated Use + * {@link IRadioNetwork#setSatelliteEnabledForCarrier(int, int, boolean)}. */ + @Deprecated public void setSatelliteEnabledForCarrier(@NonNull int simLogicalSlotIndex, @NonNull boolean satelliteEnabled, @NonNull IIntegerConsumer callback) { // stub implementation @@ -629,7 +638,11 @@ public class SatelliteImplBase extends SatelliteService { * SatelliteResult:SATELLITE_RESULT_MODEM_ERROR * SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE * SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED + * + * @deprecated Use + * {@link IRadioNetwork#isSatelliteEnabledForCarrier(int, int)}. */ + @Deprecated public void requestIsSatelliteEnabledForCarrier(@NonNull int simLogicalSlotIndex, @NonNull IIntegerConsumer resultCallback, @NonNull IBooleanConsumer callback) { // stub implementation diff --git a/tests/AppJankTest/Android.bp b/tests/AppJankTest/Android.bp index acf8dc9aca47..c3cda6a41cbb 100644 --- a/tests/AppJankTest/Android.bp +++ b/tests/AppJankTest/Android.bp @@ -30,6 +30,7 @@ android_test { "androidx.test.core", "platform-test-annotations", "flag-junit", + "androidx.test.uiautomator_uiautomator", ], platform_apis: true, test_suites: ["device-tests"], diff --git a/tests/AppJankTest/AndroidManifest.xml b/tests/AppJankTest/AndroidManifest.xml index abed1798c47c..861a79c6f0ed 100644 --- a/tests/AppJankTest/AndroidManifest.xml +++ b/tests/AppJankTest/AndroidManifest.xml @@ -19,22 +19,31 @@ package="android.app.jank.tests"> <application android:appCategory="news"> - <uses-library android:name="android.test.runner" /> + <activity android:name=".JankTrackerActivity" + android:exported="true" + android:label="JankTrackerActivity" + android:launchMode="singleTop"> + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/> + </intent-filter> + </activity> <activity android:name=".EmptyActivity" - android:label="EmptyActivity" - android:exported="true"> + android:exported="true" + android:label="EmptyActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/> </intent-filter> </activity> + <uses-library android:name="android.test.runner"/> </application> <!-- self-instrumenting test package. --> <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" - android:targetPackage="android.app.jank.tests" - android:label="Core tests of App Jank Tracking"> + android:label="Core tests of App Jank Tracking" + android:targetPackage="android.app.jank.tests"> </instrumentation> </manifest>
\ No newline at end of file diff --git a/tests/AppJankTest/res/layout/jank_tracker_activity_layout.xml b/tests/AppJankTest/res/layout/jank_tracker_activity_layout.xml new file mode 100644 index 000000000000..65def7f2d5b6 --- /dev/null +++ b/tests/AppJankTest/res/layout/jank_tracker_activity_layout.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + + +<ScrollView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fitsSystemWindows="true"> + + <LinearLayout + android:id="@+id/linear_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + <EditText + android:id="@+id/edit_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="textEnableTextConversionSuggestions" + android:text="Edit Text"/> + <TextView android:id="@+id/text_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Text View" + /> + <android.app.jank.tests.TestWidget + android:id="@+id/jank_tracker_widget" + android:layout_width="match_parent" + android:layout_height="wrap_content" + /> + </LinearLayout> +</ScrollView>
\ No newline at end of file diff --git a/tests/AppJankTest/src/android/app/jank/tests/IntegrationTests.java b/tests/AppJankTest/src/android/app/jank/tests/IntegrationTests.java new file mode 100644 index 000000000000..34f0c191ecf5 --- /dev/null +++ b/tests/AppJankTest/src/android/app/jank/tests/IntegrationTests.java @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.jank.tests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import android.app.Activity; +import android.app.Instrumentation; +import android.app.jank.AppJankStats; +import android.app.jank.Flags; +import android.app.jank.JankDataProcessor; +import android.app.jank.JankTracker; +import android.app.jank.StateTracker; +import android.content.Intent; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; +import android.widget.EditText; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.Until; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * This file contains tests that verify the proper functionality of the Jank Tracking feature. + * All tests should obtain references to necessary objects through View type interfaces, rather + * than direct instantiation. When operating outside of a testing environment, the expected + * behavior is to retrieve the necessary objects using View type interfaces. This approach ensures + * that calls are correctly routed down to the activity level. Any modifications to the call + * routing should result in test failures, which might happen with direct instantiations. + */ +@RunWith(AndroidJUnit4.class) +public class IntegrationTests { + public static final int WAIT_FOR_TIMEOUT_MS = 5000; + + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + private Activity mEmptyActivity; + + public UiDevice mDevice; + private Instrumentation mInstrumentation; + private ActivityTestRule<JankTrackerActivity> mJankTrackerActivityRule = + new ActivityTestRule<>( + JankTrackerActivity.class, + false, + false); + + private ActivityTestRule<EmptyActivity> mEmptyActivityRule = + new ActivityTestRule<>(EmptyActivity.class, false , true); + + @Before + public void setUp() { + mInstrumentation = InstrumentationRegistry.getInstrumentation(); + mDevice = UiDevice.getInstance(mInstrumentation); + } + + + /** + * Get a JankTracker object from a view and confirm it's not null. + */ + @Test + @RequiresFlagsEnabled(Flags.FLAG_DETAILED_APP_JANK_METRICS_API) + public void getJankTacker_confirmNotNull() { + Activity jankTrackerActivity = mJankTrackerActivityRule.launchActivity(null); + EditText editText = jankTrackerActivity.findViewById(R.id.edit_text); + + mDevice.wait(Until.findObject(By.text("Edit Text")), WAIT_FOR_TIMEOUT_MS); + + JankTracker jankTracker = editText.getJankTracker(); + assertTrue(jankTracker != null); + } + + @Test + @RequiresFlagsEnabled(Flags.FLAG_DETAILED_APP_JANK_METRICS_API) + public void reportJankStats_confirmPendingStatsIncreases() { + Activity jankTrackerActivity = mJankTrackerActivityRule.launchActivity(null); + EditText editText = jankTrackerActivity.findViewById(R.id.edit_text); + JankTracker jankTracker = editText.getJankTracker(); + + HashMap<String, JankDataProcessor.PendingJankStat> pendingStats = + jankTracker.getPendingJankStats(); + assertEquals(0, pendingStats.size()); + + editText.reportAppJankStats(JankUtils.getAppJankStats()); + + // reportAppJankStats performs the work on a background thread, check periodically to see + // if the work is complete. + for (int i = 0; i < 10; i++) { + try { + Thread.sleep(100); + if (jankTracker.getPendingJankStats().size() > 0) { + break; + } + } catch (InterruptedException exception) { + //do nothing and continue + } + } + + pendingStats = jankTracker.getPendingJankStats(); + + assertEquals(1, pendingStats.size()); + } + + @Test + @RequiresFlagsEnabled(Flags.FLAG_DETAILED_APP_JANK_METRICS_API) + public void simulateWidgetStateChanges_confirmStateChangesAreTracked() { + JankTrackerActivity jankTrackerActivity = + mJankTrackerActivityRule.launchActivity(null); + TestWidget testWidget = jankTrackerActivity.findViewById(R.id.jank_tracker_widget); + JankTracker jankTracker = testWidget.getJankTracker(); + jankTracker.forceListenerRegistration(); + + ArrayList<StateTracker.StateData> uiStates = new ArrayList<>(); + // Get the current UI states, at this point only the activity name should be in the UI + // states list. + jankTracker.getAllUiStates(uiStates); + + assertEquals(1, uiStates.size()); + + // This should add a UI state to be tracked. + testWidget.simulateAnimationStarting(); + uiStates.clear(); + jankTracker.getAllUiStates(uiStates); + + assertEquals(2, uiStates.size()); + + // Stop the animation + testWidget.simulateAnimationEnding(); + uiStates.clear(); + jankTracker.getAllUiStates(uiStates); + + assertEquals(2, uiStates.size()); + + // Confirm the Animation state has a VsyncIdEnd that is not default, indicating the end + // of that state. + for (int i = 0; i < uiStates.size(); i++) { + StateTracker.StateData stateData = uiStates.get(i); + if (stateData.mWidgetCategory.equals(AppJankStats.ANIMATION)) { + assertNotEquals(Long.MAX_VALUE, stateData.mVsyncIdEnd); + } + } + } + + @Test + @RequiresFlagsEnabled(Flags.FLAG_DETAILED_APP_JANK_METRICS_API) + public void jankTrackingPaused_whenActivityNoLongerVisible() { + JankTrackerActivity jankTrackerActivity = + mJankTrackerActivityRule.launchActivity(null); + TestWidget testWidget = jankTrackerActivity.findViewById(R.id.jank_tracker_widget); + JankTracker jankTracker = testWidget.getJankTracker(); + jankTracker.forceListenerRegistration(); + + assertTrue(jankTracker.shouldTrack()); + + // Send jankTrackerActivity to the background + mDevice.pressHome(); + mDevice.waitForIdle(WAIT_FOR_TIMEOUT_MS); + + assertFalse(jankTracker.shouldTrack()); + } + + @Test + @RequiresFlagsEnabled(Flags.FLAG_DETAILED_APP_JANK_METRICS_API) + public void jankTrackingResumed_whenActivityBecomesVisibleAgain() { + mEmptyActivityRule.launchActivity(null); + mEmptyActivity = mEmptyActivityRule.getActivity(); + JankTrackerActivity jankTrackerActivity = + mJankTrackerActivityRule.launchActivity(null); + TestWidget testWidget = jankTrackerActivity.findViewById(R.id.jank_tracker_widget); + JankTracker jankTracker = testWidget.getJankTracker(); + jankTracker.forceListenerRegistration(); + + // Send jankTrackerActivity to the background + mDevice.pressHome(); + mDevice.waitForIdle(WAIT_FOR_TIMEOUT_MS); + + assertFalse(jankTracker.shouldTrack()); + + Intent resumeJankTracker = new Intent(mInstrumentation.getContext(), + JankTrackerActivity.class); + resumeJankTracker.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + mEmptyActivity.startActivity(resumeJankTracker); + mDevice.wait(Until.findObject(By.text("Edit Text")), WAIT_FOR_TIMEOUT_MS); + + assertTrue(jankTracker.shouldTrack()); + } +} diff --git a/tests/AppJankTest/src/android/app/jank/tests/JankDataProcessorTest.java b/tests/AppJankTest/src/android/app/jank/tests/JankDataProcessorTest.java index 4d495adf727b..30c568be7716 100644 --- a/tests/AppJankTest/src/android/app/jank/tests/JankDataProcessorTest.java +++ b/tests/AppJankTest/src/android/app/jank/tests/JankDataProcessorTest.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertEquals; import android.app.jank.AppJankStats; import android.app.jank.Flags; -import android.app.jank.FrameOverrunHistogram; import android.app.jank.JankDataProcessor; import android.app.jank.StateTracker; import android.platform.test.annotations.RequiresFlagsEnabled; @@ -165,7 +164,7 @@ public class JankDataProcessorTest { assertEquals(pendingStats.size(), 0); - AppJankStats jankStats = getAppJankStats(); + AppJankStats jankStats = JankUtils.getAppJankStats(); mJankDataProcessor.mergeJankStats(jankStats, sActivityName); pendingStats = mJankDataProcessor.getPendingJankStats(); @@ -182,14 +181,14 @@ public class JankDataProcessorTest { @Test @RequiresFlagsEnabled(Flags.FLAG_DETAILED_APP_JANK_METRICS_API) public void mergeAppJankStats_confirmStatsWithMatchingStatesAreCombinedIntoOnePendingStat() { - AppJankStats jankStats = getAppJankStats(); + AppJankStats jankStats = JankUtils.getAppJankStats(); mJankDataProcessor.mergeJankStats(jankStats, sActivityName); HashMap<String, JankDataProcessor.PendingJankStat> pendingStats = mJankDataProcessor.getPendingJankStats(); assertEquals(pendingStats.size(), 1); - AppJankStats secondJankStat = getAppJankStats(); + AppJankStats secondJankStat = JankUtils.getAppJankStats(); mJankDataProcessor.mergeJankStats(secondJankStat, sActivityName); pendingStats = mJankDataProcessor.getPendingJankStats(); @@ -200,7 +199,7 @@ public class JankDataProcessorTest { @Test @RequiresFlagsEnabled(Flags.FLAG_DETAILED_APP_JANK_METRICS_API) public void mergeAppJankStats_whenStatsWithMatchingStatesMerge_confirmFrameCountsAdded() { - AppJankStats jankStats = getAppJankStats(); + AppJankStats jankStats = JankUtils.getAppJankStats(); mJankDataProcessor.mergeJankStats(jankStats, sActivityName); mJankDataProcessor.mergeJankStats(jankStats, sActivityName); @@ -345,27 +344,4 @@ public class JankDataProcessorTest { return mockData; } - - private AppJankStats getAppJankStats() { - AppJankStats jankStats = new AppJankStats( - /*App Uid*/APP_ID, - /*Widget Id*/"test widget id", - /*Widget Category*/AppJankStats.SCROLL, - /*Widget State*/AppJankStats.SCROLLING, - /*Total Frames*/100, - /*Janky Frames*/25, - getOverrunHistogram() - ); - return jankStats; - } - - private FrameOverrunHistogram getOverrunHistogram() { - FrameOverrunHistogram overrunHistogram = new FrameOverrunHistogram(); - overrunHistogram.addFrameOverrunMillis(-2); - overrunHistogram.addFrameOverrunMillis(1); - overrunHistogram.addFrameOverrunMillis(5); - overrunHistogram.addFrameOverrunMillis(25); - return overrunHistogram; - } - } diff --git a/tests/AppJankTest/src/android/app/jank/tests/JankTrackerActivity.java b/tests/AppJankTest/src/android/app/jank/tests/JankTrackerActivity.java new file mode 100644 index 000000000000..80ab6ad3e587 --- /dev/null +++ b/tests/AppJankTest/src/android/app/jank/tests/JankTrackerActivity.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.jank.tests; + +import android.app.Activity; +import android.os.Bundle; + + +public class JankTrackerActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.jank_tracker_activity_layout); + } +} + + diff --git a/tests/AppJankTest/src/android/app/jank/tests/JankUtils.java b/tests/AppJankTest/src/android/app/jank/tests/JankUtils.java new file mode 100644 index 000000000000..0b4d97ed20d6 --- /dev/null +++ b/tests/AppJankTest/src/android/app/jank/tests/JankUtils.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.jank.tests; + +import android.app.jank.AppJankStats; +import android.app.jank.FrameOverrunHistogram; + +public class JankUtils { + private static final int APP_ID = 25; + + /** + * Returns a mock AppJankStats object to be used in tests. + */ + public static AppJankStats getAppJankStats() { + AppJankStats jankStats = new AppJankStats( + /*App Uid*/APP_ID, + /*Widget Id*/"test widget id", + /*Widget Category*/AppJankStats.SCROLL, + /*Widget State*/AppJankStats.SCROLLING, + /*Total Frames*/100, + /*Janky Frames*/25, + getOverrunHistogram() + ); + return jankStats; + } + + /** + * Returns a mock histogram to be used with an AppJankStats object. + */ + public static FrameOverrunHistogram getOverrunHistogram() { + FrameOverrunHistogram overrunHistogram = new FrameOverrunHistogram(); + overrunHistogram.addFrameOverrunMillis(-2); + overrunHistogram.addFrameOverrunMillis(1); + overrunHistogram.addFrameOverrunMillis(5); + overrunHistogram.addFrameOverrunMillis(25); + return overrunHistogram; + } +} diff --git a/tests/AppJankTest/src/android/app/jank/tests/TestWidget.java b/tests/AppJankTest/src/android/app/jank/tests/TestWidget.java new file mode 100644 index 000000000000..5fff46038ead --- /dev/null +++ b/tests/AppJankTest/src/android/app/jank/tests/TestWidget.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.jank.tests; + +import android.app.jank.AppJankStats; +import android.app.jank.JankTracker; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +public class TestWidget extends View { + + private JankTracker mJankTracker; + + /** + * Create JankTrackerView + */ + public TestWidget(Context context) { + super(context); + } + + /** + * Create JankTrackerView, needed by system when inflating views defined in a layout file. + */ + public TestWidget(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + } + + /** + * Mock starting an animation. + */ + public void simulateAnimationStarting() { + if (jankTrackerCreated()) { + mJankTracker.addUiState(AppJankStats.ANIMATION, + Integer.toString(this.getId()), AppJankStats.ANIMATING); + } + } + + /** + * Mock ending an animation. + */ + public void simulateAnimationEnding() { + if (jankTrackerCreated()) { + mJankTracker.removeUiState(AppJankStats.ANIMATION, + Integer.toString(this.getId()), AppJankStats.ANIMATING); + } + } + + private boolean jankTrackerCreated() { + if (mJankTracker == null) { + mJankTracker = getJankTracker(); + } + return mJankTracker != null; + } +} diff --git a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt index 038c6d7754b5..aea75d8e7c85 100644 --- a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt +++ b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt @@ -28,10 +28,11 @@ import android.hardware.display.DisplayViewport import android.hardware.display.VirtualDisplay import android.hardware.input.InputManager import android.hardware.input.InputManagerGlobal +import android.hardware.input.InputSettings +import android.hardware.input.KeyGestureEvent import android.os.InputEventInjectionSync import android.os.SystemClock import android.os.test.TestLooper -import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.Presubmit import android.platform.test.flag.junit.SetFlagsRule import android.provider.Settings @@ -99,6 +100,7 @@ class InputManagerServiceTests { .mockStatic(LocalServices::class.java) .mockStatic(PermissionChecker::class.java) .mockStatic(KeyCharacterMap::class.java) + .mockStatic(InputSettings::class.java) .build()!! @get:Rule @@ -481,32 +483,102 @@ class InputManagerServiceTests { } @Test - @EnableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER) fun handleKeyGestures_keyboardBacklight() { - service.systemRunning() - - val backlightDownEvent = createKeyEvent(KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN) - service.interceptKeyBeforeDispatching(null, backlightDownEvent, /* policyFlags = */0) + val backlightDownEvent = + KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN) + .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + .build() + service.handleKeyGestureEvent(backlightDownEvent) verify(kbdController).decrementKeyboardBacklight(anyInt()) - val backlightUpEvent = createKeyEvent(KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP) - service.interceptKeyBeforeDispatching(null, backlightUpEvent, /* policyFlags = */0) + val backlightUpEvent = + KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP) + .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + .build() + service.handleKeyGestureEvent(backlightUpEvent) verify(kbdController).incrementKeyboardBacklight(anyInt()) } @Test - @EnableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER) - fun handleKeyGestures_toggleCapsLock() { - service.systemRunning() + fun handleKeyGestures_a11yBounceKeysShortcut() { + ExtendedMockito.doReturn(true).`when` { + InputSettings.isAccessibilityBounceKeysFeatureEnabled() + } + val toggleBounceKeysEvent = + KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS) + .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + .build() + service.handleKeyGestureEvent(toggleBounceKeysEvent) + ExtendedMockito.verify { + InputSettings.setAccessibilityBounceKeysThreshold( + any(), + eq(InputSettings.DEFAULT_BOUNCE_KEYS_THRESHOLD_MILLIS) + ) + } + } - val metaDownEvent = createKeyEvent(KeyEvent.KEYCODE_META_LEFT) - service.interceptKeyBeforeDispatching(null, metaDownEvent, /* policyFlags = */0) - val altDownEvent = - createKeyEvent(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_META_ON, KeyEvent.ACTION_DOWN) - service.interceptKeyBeforeDispatching(null, altDownEvent, /* policyFlags = */0) - val altUpEvent = - createKeyEvent(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_META_ON, KeyEvent.ACTION_UP) - service.interceptKeyBeforeDispatching(null, altUpEvent, /* policyFlags = */0) + @Test + fun handleKeyGestures_a11yMouseKeysShortcut() { + ExtendedMockito.doReturn(true).`when` { + InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() + } + val toggleMouseKeysEvent = + KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS) + .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + .build() + service.handleKeyGestureEvent(toggleMouseKeysEvent) + ExtendedMockito.verify { + InputSettings.setAccessibilityMouseKeysEnabled(any(), eq(true)) + } + } + + @Test + fun handleKeyGestures_a11yStickyKeysShortcut() { + ExtendedMockito.doReturn(true).`when` { + InputSettings.isAccessibilityStickyKeysFeatureEnabled() + } + val toggleStickyKeysEvent = + KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS) + .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + .build() + service.handleKeyGestureEvent(toggleStickyKeysEvent) + ExtendedMockito.verify { + InputSettings.setAccessibilityStickyKeysEnabled(any(), eq(true)) + } + } + + @Test + fun handleKeyGestures_a11ySlowKeysShortcut() { + ExtendedMockito.doReturn(true).`when` { + InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() + } + val toggleSlowKeysEvent = + KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS) + .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + .build() + service.handleKeyGestureEvent(toggleSlowKeysEvent) + ExtendedMockito.verify { + InputSettings.setAccessibilitySlowKeysThreshold( + any(), + eq(InputSettings.DEFAULT_SLOW_KEYS_THRESHOLD_MILLIS) + ) + } + } + + @Test + fun handleKeyGestures_toggleCapsLock() { + val toggleCapsLockEvent = + KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK) + .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + .build() + service.handleKeyGestureEvent(toggleCapsLockEvent) verify(native).toggleCapsLock(anyInt()) } @@ -541,30 +613,10 @@ class InputManagerServiceTests { 0 }, "title", - /* uid = */0, - /* inputFeatureFlags = */ 0 + /* uid = */0 ) whenever(windowManagerInternal.getKeyInterceptionInfoFromToken(any())).thenReturn(info) } - - private fun createKeyEvent( - keycode: Int, - modifierState: Int = 0, - action: Int = KeyEvent.ACTION_DOWN - ): KeyEvent { - return KeyEvent( - /* downTime = */0, - /* eventTime = */0, - action, - keycode, - /* repeat = */0, - modifierState, - KeyCharacterMap.VIRTUAL_KEYBOARD, - /* scancode = */0, - /* flags = */0, - InputDevice.SOURCE_KEYBOARD - ) - } } private fun <T> whenever(methodCall: T): OngoingStubbing<T> = `when`(methodCall) diff --git a/tests/Input/src/com/android/test/input/KeyCharacterMapTest.kt b/tests/Input/src/com/android/test/input/KeyCharacterMapTest.kt new file mode 100644 index 000000000000..281837920548 --- /dev/null +++ b/tests/Input/src/com/android/test/input/KeyCharacterMapTest.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.test.input + +import android.view.KeyCharacterMap +import android.view.KeyEvent + +import org.junit.Assert.assertEquals +import org.junit.Test + +/** + * Tests for {@link KeyCharacterMap}. + * + * <p>Build/Install/Run: + * atest KeyCharacterMapTest + * + */ +class KeyCharacterMapTest { + @Test + fun testGetFallback() { + // Based off of VIRTUAL kcm fallbacks. + val keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD) + + // One modifier fallback. + assertEquals( + keyCharacterMap.getFallbackAction(KeyEvent.KEYCODE_SPACE, + KeyEvent.META_CTRL_ON).keyCode, + KeyEvent.KEYCODE_LANGUAGE_SWITCH) + + // Multiple modifier fallback. + assertEquals( + keyCharacterMap.getFallbackAction(KeyEvent.KEYCODE_DEL, + KeyEvent.META_CTRL_ON or KeyEvent.META_ALT_ON).keyCode, + KeyEvent.KEYCODE_BACK) + + // No default button, fallback only. + assertEquals( + keyCharacterMap.getFallbackAction(KeyEvent.KEYCODE_BUTTON_A, 0).keyCode, + KeyEvent.KEYCODE_DPAD_CENTER) + } +} diff --git a/tests/broadcasts/unit/src/android/app/BroadcastStickyCacheTest.java b/tests/broadcasts/unit/src/android/app/BroadcastStickyCacheTest.java index ad032fb2fba6..15a580c9e8f7 100644 --- a/tests/broadcasts/unit/src/android/app/BroadcastStickyCacheTest.java +++ b/tests/broadcasts/unit/src/android/app/BroadcastStickyCacheTest.java @@ -20,6 +20,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; @@ -186,6 +187,22 @@ public class BroadcastStickyCacheTest { } @Test + public void getIntent_queryActionTwiceWithNullResult_verifyRegisterReceiverIsCalledOnce() + throws RemoteException { + setActivityManagerMock(null); + final Intent intent = queryIntent(new IntentFilter(Intent.ACTION_DEVICE_STORAGE_FULL)); + final Intent cachedIntent = queryIntent( + new IntentFilter(Intent.ACTION_DEVICE_STORAGE_FULL)); + + assertNull(intent); + assertNull(cachedIntent); + + verify(mActivityManagerMock, times(1)).registerReceiverWithFeature( + eq(mIApplicationThreadMock), anyString(), anyString(), anyString(), any(), + any(), anyString(), anyInt(), anyInt()); + } + + @Test public void getIntent_querySameActionWithDifferentFilter_verifyRegisterReceiverCalledTwice() throws RemoteException { setActivityManagerMock(Intent.ACTION_DEVICE_STORAGE_LOW); @@ -226,6 +243,6 @@ public class BroadcastStickyCacheTest { when(ActivityManager.getService()).thenReturn(mActivityManagerMock); when(mActivityManagerMock.registerReceiverWithFeature(any(), anyString(), anyString(), anyString(), any(), any(), anyString(), anyInt(), - anyInt())).thenReturn(new Intent(action)); + anyInt())).thenReturn(action != null ? new Intent(action) : null); } } diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt index c3595b7ac288..272d8bb1793d 100644 --- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt @@ -119,7 +119,8 @@ class ProtoLogCallProcessorImpl( } logCallVisitor?.processCall(call, messageString, getLevelForMethodName( - call.name.toString(), call, context), groupMap.getValue(groupName)) + call.name.toString(), call, context), groupMap.getValue(groupName), + context.lineNumber) } else if (call.name.id == "init") { // No processing } else { diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallVisitor.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallVisitor.kt index 8cd927a7cd0e..216241ac5a47 100644 --- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallVisitor.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallVisitor.kt @@ -20,5 +20,11 @@ import com.android.internal.protolog.common.LogLevel import com.github.javaparser.ast.expr.MethodCallExpr interface ProtoLogCallVisitor { - fun processCall(call: MethodCallExpr, messageString: String, level: LogLevel, group: LogGroup) + fun processCall( + call: MethodCallExpr, + messageString: String, + level: LogLevel, + group: LogGroup, + lineNumber: Int + ) } diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt index 9222ff4bf52c..d8a2954545bb 100644 --- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt @@ -69,7 +69,8 @@ object ProtoLogTool { val messageString: String, val logLevel: LogLevel, val logGroup: LogGroup, - val position: String + val position: String, + val lineNumber: Int, ) private fun showHelpAndExit() { @@ -435,9 +436,10 @@ object ProtoLogTool { call: MethodCallExpr, messageString: String, level: LogLevel, - group: LogGroup + group: LogGroup, + lineNumber: Int, ) { - val logCall = LogCall(messageString, level, group, packagePath) + val logCall = LogCall(messageString, level, group, packagePath, lineNumber) calls.add(logCall) } } diff --git a/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt index c478f5844de6..76df0674df65 100644 --- a/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt +++ b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt @@ -91,7 +91,8 @@ class SourceTransformer( call: MethodCallExpr, messageString: String, level: LogLevel, - group: LogGroup + group: LogGroup, + lineNumber: Int, ) { validateCall(call) val processedCallStatement = diff --git a/tools/protologtool/src/com/android/protolog/tool/ViewerConfigProtoBuilder.kt b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigProtoBuilder.kt index de85411e4ffc..5af2d9440533 100644 --- a/tools/protologtool/src/com/android/protolog/tool/ViewerConfigProtoBuilder.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigProtoBuilder.kt @@ -59,7 +59,7 @@ class ViewerConfigProtoBuilder : ProtoLogTool.ProtologViewerConfigBuilder { .setLevel( ProtoLogLevel.forNumber(log.logLevel.id)) .setGroupId(groupId) - .setLocation(log.position) + .setLocation("${log.position}:${log.lineNumber}") ) } diff --git a/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt b/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt index 5e50f71d75cc..004d97babbad 100644 --- a/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt @@ -42,7 +42,8 @@ class ProtoLogCallProcessorImplTest { call: MethodCallExpr, messageString: String, level: LogLevel, - group: LogGroup + group: LogGroup, + lineNumber: Int, ) { calls.add(LogCall(call, messageString, level, group)) } diff --git a/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt index 6cde7a72db53..674a907d68d9 100644 --- a/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt @@ -158,7 +158,7 @@ class SourceTransformerTest { val visitor = invocation.arguments[1] as ProtoLogCallVisitor visitor.processCall(code.findAll(MethodCallExpr::class.java)[0], "test %d %f", - LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST")) + LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST"), 123) invocation.arguments[0] as CompilationUnit } @@ -195,11 +195,11 @@ class SourceTransformerTest { val calls = code.findAll(MethodCallExpr::class.java) visitor.processCall(calls[0], "test %d %f", - LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST")) + LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST"), 456) visitor.processCall(calls[1], "test %d %f", - LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST")) + LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST"), 789) visitor.processCall(calls[2], "test %d %f", - LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST")) + LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST"), 123) invocation.arguments[0] as CompilationUnit } @@ -236,7 +236,7 @@ class SourceTransformerTest { visitor.processCall(code.findAll(MethodCallExpr::class.java)[0], "test %d %f abc %s\n test", LogLevel.WARN, LogGroup("TEST_GROUP", - true, true, "WM_TEST")) + true, true, "WM_TEST"), 123) invocation.arguments[0] as CompilationUnit } @@ -273,7 +273,7 @@ class SourceTransformerTest { val visitor = invocation.arguments[1] as ProtoLogCallVisitor visitor.processCall(code.findAll(MethodCallExpr::class.java)[0], "test", - LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST")) + LogLevel.WARN, LogGroup("TEST_GROUP", true, true, "WM_TEST"), 456) invocation.arguments[0] as CompilationUnit } @@ -307,7 +307,7 @@ class SourceTransformerTest { val visitor = invocation.arguments[1] as ProtoLogCallVisitor visitor.processCall(code.findAll(MethodCallExpr::class.java)[0], "test %d %f", - LogLevel.WARN, LogGroup("TEST_GROUP", true, false, "WM_TEST")) + LogLevel.WARN, LogGroup("TEST_GROUP", true, false, "WM_TEST"), 789) invocation.arguments[0] as CompilationUnit } @@ -344,7 +344,7 @@ class SourceTransformerTest { visitor.processCall(code.findAll(MethodCallExpr::class.java)[0], "test %d %f abc %s\n test", LogLevel.WARN, LogGroup("TEST_GROUP", - true, false, "WM_TEST")) + true, false, "WM_TEST"), 123) invocation.arguments[0] as CompilationUnit } diff --git a/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigJsonBuilderTest.kt b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigJsonBuilderTest.kt index 1a20d4c5bad6..bcbc8790e170 100644 --- a/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigJsonBuilderTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigJsonBuilderTest.kt @@ -50,9 +50,9 @@ class ViewerConfigJsonBuilderTest { fun processClass() { val logCallRegistry = ProtoLogTool.LogCallRegistry() logCallRegistry.addLogCalls(listOf( - LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH), - LogCall(TEST2.messageString, LogLevel.DEBUG, GROUP2, PATH), - LogCall(TEST3.messageString, LogLevel.ERROR, GROUP3, PATH))) + LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH, 123), + LogCall(TEST2.messageString, LogLevel.DEBUG, GROUP2, PATH, 456), + LogCall(TEST3.messageString, LogLevel.ERROR, GROUP3, PATH, 789))) val parsedConfig = parseConfig( configBuilder.build(GROUPS, logCallRegistry.getStatements()).toString(Charsets.UTF_8)) @@ -69,9 +69,9 @@ class ViewerConfigJsonBuilderTest { fun processClass_nonUnique() { val logCallRegistry = ProtoLogTool.LogCallRegistry() logCallRegistry.addLogCalls(listOf( - LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH), - LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH), - LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH))) + LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH, 123), + LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH, 456), + LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH, 789))) val parsedConfig = parseConfig( configBuilder.build(GROUPS, logCallRegistry.getStatements()).toString(Charsets.UTF_8)) diff --git a/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigProtoBuilderTest.kt b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigProtoBuilderTest.kt index 74a8de7f70c0..dfc66405eec9 100644 --- a/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigProtoBuilderTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigProtoBuilderTest.kt @@ -55,8 +55,8 @@ class ViewerConfigProtoBuilderTest { val logCallRegistry = ProtoLogTool.LogCallRegistry() logCallRegistry.addLogCalls(listOf( - LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH), - LogCall(TEST2.messageString, LogLevel.INFO, GROUP2, PATH), + LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH, 123), + LogCall(TEST2.messageString, LogLevel.INFO, GROUP2, PATH, 456), )) val rawProto = configBuilder.build(GROUPS, logCallRegistry.getStatements()) @@ -65,4 +65,22 @@ class ViewerConfigProtoBuilderTest { Truth.assertThat(viewerConfig.groupsCount).isEqualTo(GROUPS.size) Truth.assertThat(viewerConfig.messagesCount).isLessThan(GROUPS.size) } + + @Test + fun includesLineNumberInLocation() { + val configBuilder = ViewerConfigProtoBuilder() + + val logCallRegistry = ProtoLogTool.LogCallRegistry() + logCallRegistry.addLogCalls(listOf( + LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH, 123), + LogCall(TEST2.messageString, LogLevel.INFO, GROUP2, PATH, 456), + )) + + val rawProto = configBuilder.build(GROUPS, logCallRegistry.getStatements()) + + val viewerConfig = ProtoLogViewerConfig.parseFrom(rawProto) + + Truth.assertThat(viewerConfig.messagesList[0].location).isEqualTo("$PATH:123") + Truth.assertThat(viewerConfig.messagesList[1].location).isEqualTo("$PATH:456") + } }
\ No newline at end of file diff --git a/tools/systemfeatures/src/com/android/systemfeatures/SystemFeaturesMetadataProcessor.kt b/tools/systemfeatures/src/com/android/systemfeatures/SystemFeaturesMetadataProcessor.kt index 4a6d4b1f49ef..c51c6d661314 100644 --- a/tools/systemfeatures/src/com/android/systemfeatures/SystemFeaturesMetadataProcessor.kt +++ b/tools/systemfeatures/src/com/android/systemfeatures/SystemFeaturesMetadataProcessor.kt @@ -18,9 +18,11 @@ package com.android.systemfeatures import android.annotation.SdkConstant import com.squareup.javapoet.ClassName +import com.squareup.javapoet.CodeBlock import com.squareup.javapoet.FieldSpec import com.squareup.javapoet.JavaFile import com.squareup.javapoet.MethodSpec +import com.squareup.javapoet.ParameterizedTypeName import com.squareup.javapoet.TypeSpec import java.io.IOException import javax.annotation.processing.AbstractProcessor @@ -101,8 +103,8 @@ class SystemFeaturesMetadataProcessor : AbstractProcessor() { TypeSpec.classBuilder("SystemFeaturesMetadata") .addModifiers(Modifier.PUBLIC, Modifier.FINAL) .addJavadoc("@hide") - .addField(buildFeatureCount(featureVarNames)) - .addMethod(buildFeatureIndexLookup(featureVarNames)) + .addFeatureCount(featureVarNames) + .addFeatureIndexLookup(featureVarNames) .build() try { @@ -120,19 +122,55 @@ class SystemFeaturesMetadataProcessor : AbstractProcessor() { return true } - private fun buildFeatureCount(featureVarNames: Collection<String>): FieldSpec { - return FieldSpec.builder(Int::class.java, "SDK_FEATURE_COUNT") - .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) - .addJavadoc( - "# of {@link android.annotation.SdkConstant}` features defined in PackageManager." - ) - .addJavadoc("\n\n@hide") - .initializer("\$L", featureVarNames.size) - .build() + private fun TypeSpec.Builder.addFeatureCount( + featureVarNames: Collection<String> + ): TypeSpec.Builder { + return addField( + FieldSpec.builder(Int::class.java, "SDK_FEATURE_COUNT") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) + .addJavadoc( + "# of {@link android.annotation.SdkConstant}` features in PackageManager." + ) + .addJavadoc("\n\n@hide") + .initializer("\$L", featureVarNames.size) + .build() + ) } - private fun buildFeatureIndexLookup(featureVarNames: Collection<String>): MethodSpec { - val methodBuilder = + private fun TypeSpec.Builder.addFeatureIndexLookup( + featureVarNames: Collection<String> + ): TypeSpec.Builder { + // NOTE: This was initially implemented in terms of a single, long switch() statement. + // However, this resulted in: + // 1) relatively large compiled code size for the lookup method (~20KB) + // 2) worse runtime lookup performance than a simple ArraySet + // The ArraySet approach adds just ~1KB to the code/image and is 2x faster at runtime. + + // Provide the initial capacity of the ArraySet for efficiency. + addField( + FieldSpec.builder( + ParameterizedTypeName.get(ARRAYSET_CLASS, ClassName.get(String::class.java)), + "sFeatures", + ) + .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) + .initializer("new ArraySet<>(\$L)", featureVarNames.size) + .build() + ) + + // Use a temp array + Collections.addAll() to minimizes the generated code size. + addStaticBlock( + CodeBlock.builder() + .add("final \$T[] features = {\n", String::class.java) + .indent() + .apply { featureVarNames.forEach { add("\$T.\$N,\n", PACKAGEMANAGER_CLASS, it) } } + .unindent() + .addStatement("}") + .addStatement("\$T.addAll(sFeatures, features)", COLLECTIONS_CLASS) + .build() + ) + + // Use ArraySet.indexOf to provide the implicit feature index mapping. + return addMethod( MethodSpec.methodBuilder("maybeGetSdkFeatureIndex") .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .addJavadoc("@return an index in [0, SDK_FEATURE_COUNT) for features defined ") @@ -140,21 +178,15 @@ class SystemFeaturesMetadataProcessor : AbstractProcessor() { .addJavadoc("\n\n@hide") .returns(Int::class.java) .addParameter(String::class.java, "featureName") - methodBuilder.beginControlFlow("switch (featureName)") - featureVarNames.forEachIndexed { index, featureVarName -> - methodBuilder - .addCode("case \$T.\$N: ", PACKAGEMANAGER_CLASS, featureVarName) - .addStatement("return \$L", index) - } - methodBuilder - .addCode("default: ") - .addStatement("return -1") - .endControlFlow() - return methodBuilder.build() + .addStatement("return sFeatures.indexOf(featureName)") + .build() + ) } companion object { private val SDK_CONSTANT_ANNOTATION_NAME = SdkConstant::class.qualifiedName private val PACKAGEMANAGER_CLASS = ClassName.get("android.content.pm", "PackageManager") + private val ARRAYSET_CLASS = ClassName.get("android.util", "ArraySet") + private val COLLECTIONS_CLASS = ClassName.get("java.util", "Collections") } } diff --git a/tools/systemfeatures/tests/src/ArraySet.java b/tools/systemfeatures/tests/src/ArraySet.java new file mode 100644 index 000000000000..0eb8f298bd89 --- /dev/null +++ b/tools/systemfeatures/tests/src/ArraySet.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.util; + +import java.util.ArrayList; + +/** Stub for testing, we extend ArrayList to get indexOf() for free. */ +public final class ArraySet<K> extends ArrayList<K> { + public ArraySet(int capacity) { + super(capacity); + } + + @Override + public boolean add(K k) { + if (!contains(k)) { + return super.add(k); + } + return false; + } +} |