diff options
216 files changed, 2011 insertions, 894 deletions
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index 77aa14c37d79..28069743d957 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -37,6 +37,7 @@ import android.os.Bundle; import android.os.ParcelableException; import android.os.RemoteException; import android.os.UserHandle; +import android.os.UserManager; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; @@ -58,6 +59,7 @@ public class AppSearchManagerService extends SystemService { private static final String TAG = "AppSearchManagerService"; private PackageManagerInternal mPackageManagerInternal; private ImplInstanceManager mImplInstanceManager; + private UserManager mUserManager; // Cache of unlocked user ids so we don't have to query UserManager service each time. The // "locked" suffix refers to the fact that access to the field should be locked; unrelated to @@ -74,10 +76,11 @@ public class AppSearchManagerService extends SystemService { publishBinderService(Context.APP_SEARCH_SERVICE, new Stub()); mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mImplInstanceManager = ImplInstanceManager.getInstance(getContext()); + mUserManager = getContext().getSystemService(UserManager.class); } @Override - public void onUserUnlocked(@NonNull TargetUser user) { + public void onUserUnlocking(@NonNull TargetUser user) { synchronized (mUnlockedUserIdsLocked) { mUnlockedUserIdsLocked.add(user.getUserIdentifier()); } @@ -509,7 +512,13 @@ public class AppSearchManagerService extends SystemService { private void verifyUserUnlocked(int callingUserId) { synchronized (mUnlockedUserIdsLocked) { - if (!mUnlockedUserIdsLocked.contains(callingUserId)) { + // First, check the local copy. + if (mUnlockedUserIdsLocked.contains(callingUserId)) { + return; + } + // If the local copy says the user is locked, check with UM for the actual state, + // since the user might just have been unlocked. + if (!mUserManager.isUserUnlockingOrUnlocked(UserHandle.of(callingUserId))) { throw new IllegalStateException( "User " + callingUserId + " is locked or not running."); } diff --git a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java index 2ce85ee57205..8c06338560bf 100644 --- a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +++ b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java @@ -136,6 +136,23 @@ public interface AppStandbyInternal { void restrictApp(@NonNull String packageName, int userId, @SystemForcedReasons int restrictReason); + /** + * Put the specified app in the + * {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED} + * bucket. If it has been used by the user recently, the restriction will delayed + * until an appropriate time. This should only be used in cases where + * {@link #restrictApp(String, int, int)} is not sufficient. + * + * @param mainReason The main reason for restricting the app. Must be either {@link + * android.app.usage.UsageStatsManager#REASON_MAIN_FORCED_BY_SYSTEM} or + * {@link android.app.usage.UsageStatsManager#REASON_MAIN_FORCED_BY_USER}. + * Calls providing any other value will be ignored. + * @param restrictReason The restrictReason for restricting the app. Should be one of the + * UsageStatsManager.REASON_SUB_FORCED_SYSTEM_FLAG_* reasons. + */ + void restrictApp(@NonNull String packageName, int userId, int mainReason, + @SystemForcedReasons int restrictReason); + void addActiveDeviceAdmin(String adminPkg, int userId); void setActiveAdminApps(Set<String> adminPkgs, int userId); 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 82f2f69bbde5..2b08ba554404 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -793,6 +793,13 @@ public class JobSchedulerService extends com.android.server.SystemService mDebuggableApps.remove(pkgName); } } + } else if (Intent.ACTION_USER_ADDED.equals(action)) { + final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); + synchronized (mLock) { + for (int c = 0; c < mControllers.size(); ++c) { + mControllers.get(c).onUserAddedLocked(userId); + } + } } else if (Intent.ACTION_USER_REMOVED.equals(action)) { final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); if (DEBUG) { @@ -1454,6 +1461,7 @@ public class JobSchedulerService extends com.android.server.SystemService getContext().registerReceiverAsUser( mBroadcastReceiver, UserHandle.ALL, filter, null, null); final IntentFilter userFilter = new IntentFilter(Intent.ACTION_USER_REMOVED); + userFilter.addAction(Intent.ACTION_USER_ADDED); getContext().registerReceiverAsUser( mBroadcastReceiver, UserHandle.ALL, userFilter, null, null); try { diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java index 784c63a6cf1f..2b79969f4378 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java @@ -28,6 +28,7 @@ import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX; import static com.android.server.job.JobSchedulerService.WORKING_INDEX; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -42,7 +43,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.PackageManagerInternal; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.os.BatteryManager; import android.os.BatteryManagerInternal; import android.os.Handler; @@ -118,6 +121,10 @@ public final class QuotaController extends StateController { private static final String ALARM_TAG_CLEANUP = "*job.cleanup*"; private static final String ALARM_TAG_QUOTA_CHECK = "*job.quota_check*"; + private static final int SYSTEM_APP_CHECK_FLAGS = + PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE + | PackageManager.GET_PERMISSIONS | PackageManager.MATCH_KNOWN_PACKAGES; + /** * Standardize the output of userId-packageName combo. */ @@ -526,7 +533,9 @@ public final class QuotaController extends StateController { QcConstants.DEFAULT_EJ_LIMIT_RESTRICTED_MS }; - private long mEjLimitSpecialAdditionMs = QcConstants.DEFAULT_EJ_LIMIT_SPECIAL_ADDITION_MS; + private long mEjLimitAdditionInstallerMs = QcConstants.DEFAULT_EJ_LIMIT_ADDITION_INSTALLER_MS; + + private long mEjLimitAdditionSpecialMs = QcConstants.DEFAULT_EJ_LIMIT_ADDITION_SPECIAL_MS; /** * The period of time used to calculate expedited job sessions. Apps can only have expedited job @@ -560,9 +569,11 @@ public final class QuotaController extends StateController { private long mEJGracePeriodTopAppMs = QcConstants.DEFAULT_EJ_GRACE_PERIOD_TOP_APP_MS; - /** The package verifier app. */ - @Nullable - private String mPackageVerifier; + /** + * List of system apps with the {@link android.Manifest.permission#INSTALL_PACKAGES} permission + * granted for each user. + */ + private final SparseSetArray<String> mSystemInstallers = new SparseSetArray<>(); /** An app has reached its quota. The message should contain a {@link Package} object. */ @VisibleForTesting @@ -627,11 +638,8 @@ public final class QuotaController extends StateController { @Override public void onSystemServicesReady() { - String[] pkgNames = LocalServices.getService(PackageManagerInternal.class) - .getKnownPackageNames( - PackageManagerInternal.PACKAGE_VERIFIER, UserHandle.USER_SYSTEM); synchronized (mLock) { - mPackageVerifier = ArrayUtils.firstOrNull(pkgNames); + cacheInstallerPackagesLocked(UserHandle.USER_SYSTEM); } } @@ -731,6 +739,11 @@ public final class QuotaController extends StateController { } @Override + public void onUserAddedLocked(int userId) { + cacheInstallerPackagesLocked(userId); + } + + @Override public void onUserRemovedLocked(int userId) { mTrackedJobs.delete(userId); mPkgTimers.delete(userId); @@ -741,6 +754,7 @@ public final class QuotaController extends StateController { mExecutionStatsCache.delete(userId); mEJStats.delete(userId); mUidToPackageCache.clear(); + mSystemInstallers.remove(userId); } /** Drop all historical stats and stop tracking any active sessions for the specified app. */ @@ -767,6 +781,22 @@ public final class QuotaController extends StateController { mEJStats.delete(userId, packageName); } + private void cacheInstallerPackagesLocked(int userId) { + final List<PackageInfo> packages = mContext.getPackageManager() + .getInstalledPackagesAsUser(SYSTEM_APP_CHECK_FLAGS, userId); + for (int i = packages.size() - 1; i >= 0; --i) { + final PackageInfo pi = packages.get(i); + final ApplicationInfo ai = pi.applicationInfo; + final int idx = ArrayUtils.indexOf( + pi.requestedPermissions, Manifest.permission.INSTALL_PACKAGES); + + if (idx >= 0 && ai != null && PackageManager.PERMISSION_GRANTED + == mContext.checkPermission(Manifest.permission.INSTALL_PACKAGES, -1, ai.uid)) { + mSystemInstallers.add(UserHandle.getUserId(ai.uid), pi.packageName); + } + } + } + private boolean isUidInForeground(int uid) { if (UserHandle.isCore(uid)) { return true; @@ -962,7 +992,8 @@ public final class QuotaController extends StateController { if (quota.getStandbyBucketLocked() == NEVER_INDEX) { return 0; } - final long limitMs = getEJLimitMsLocked(packageName, quota.getStandbyBucketLocked()); + final long limitMs = + getEJLimitMsLocked(userId, packageName, quota.getStandbyBucketLocked()); long remainingMs = limitMs - quota.getTallyLocked(); // Stale sessions may still be factored into tally. Make sure they're removed. @@ -1000,10 +1031,11 @@ public final class QuotaController extends StateController { return remainingMs - timer.getCurrentDuration(sElapsedRealtimeClock.millis()); } - private long getEJLimitMsLocked(@NonNull final String packageName, final int standbyBucket) { + private long getEJLimitMsLocked(final int userId, @NonNull final String packageName, + final int standbyBucket) { final long baseLimitMs = mEJLimitsMs[standbyBucket]; - if (packageName.equals(mPackageVerifier)) { - return baseLimitMs + mEjLimitSpecialAdditionMs; + if (mSystemInstallers.contains(userId, packageName)) { + return baseLimitMs + mEjLimitAdditionInstallerMs; } return baseLimitMs; } @@ -1116,7 +1148,8 @@ public final class QuotaController extends StateController { final long nowElapsed = sElapsedRealtimeClock.millis(); ShrinkableDebits quota = getEJDebitsLocked(userId, packageName); - final long limitMs = getEJLimitMsLocked(packageName, quota.getStandbyBucketLocked()); + final long limitMs = + getEJLimitMsLocked(userId, packageName, quota.getStandbyBucketLocked()); final long startWindowElapsed = Math.max(0, nowElapsed - mEJLimitWindowSizeMs); long remainingDeadSpaceMs = remainingExecutionTimeMs; // Total time looked at where a session wouldn't be phasing out. @@ -1743,7 +1776,8 @@ public final class QuotaController extends StateController { inRegularQuotaTimeElapsed = inQuotaTimeElapsed; } if (remainingEJQuota <= 0) { - final long limitMs = getEJLimitMsLocked(packageName, standbyBucket) - mQuotaBufferMs; + final long limitMs = + getEJLimitMsLocked(userId, packageName, standbyBucket) - mQuotaBufferMs; long sumMs = 0; final Timer ejTimer = mEJPkgTimers.get(userId, packageName); if (ejTimer != null && ejTimer.isActive()) { @@ -3029,8 +3063,11 @@ public final class QuotaController extends StateController { static final String KEY_EJ_LIMIT_RESTRICTED_MS = QC_CONSTANT_PREFIX + "ej_limit_restricted_ms"; @VisibleForTesting - static final String KEY_EJ_LIMIT_SPECIAL_ADDITION_MS = - QC_CONSTANT_PREFIX + "ej_limit_special_addition_ms"; + static final String KEY_EJ_LIMIT_ADDITION_SPECIAL_MS = + QC_CONSTANT_PREFIX + "ej_limit_addition_special_ms"; + @VisibleForTesting + static final String KEY_EJ_LIMIT_ADDITION_INSTALLER_MS = + QC_CONSTANT_PREFIX + "ej_limit_addition_installer_ms"; @VisibleForTesting static final String KEY_EJ_WINDOW_SIZE_MS = QC_CONSTANT_PREFIX + "ej_window_size_ms"; @@ -3098,7 +3135,8 @@ public final class QuotaController extends StateController { private static final long DEFAULT_EJ_LIMIT_FREQUENT_MS = 10 * MINUTE_IN_MILLIS; private static final long DEFAULT_EJ_LIMIT_RARE_MS = DEFAULT_EJ_LIMIT_FREQUENT_MS; private static final long DEFAULT_EJ_LIMIT_RESTRICTED_MS = 5 * MINUTE_IN_MILLIS; - private static final long DEFAULT_EJ_LIMIT_SPECIAL_ADDITION_MS = 30 * MINUTE_IN_MILLIS; + private static final long DEFAULT_EJ_LIMIT_ADDITION_SPECIAL_MS = 15 * MINUTE_IN_MILLIS; + private static final long DEFAULT_EJ_LIMIT_ADDITION_INSTALLER_MS = 30 * MINUTE_IN_MILLIS; private static final long DEFAULT_EJ_WINDOW_SIZE_MS = 24 * HOUR_IN_MILLIS; private static final long DEFAULT_EJ_TOP_APP_TIME_CHUNK_SIZE_MS = 30 * SECOND_IN_MILLIS; private static final long DEFAULT_EJ_REWARD_TOP_APP_MS = 10 * SECOND_IN_MILLIS; @@ -3303,7 +3341,13 @@ public final class QuotaController extends StateController { /** * How much additional EJ quota special, critical apps should get. */ - public long EJ_LIMIT_SPECIAL_ADDITION_MS = DEFAULT_EJ_LIMIT_SPECIAL_ADDITION_MS; + public long EJ_LIMIT_ADDITION_SPECIAL_MS = DEFAULT_EJ_LIMIT_ADDITION_SPECIAL_MS; + + /** + * How much additional EJ quota system installers (with the INSTALL_PACKAGES permission) + * should get. + */ + public long EJ_LIMIT_ADDITION_INSTALLER_MS = DEFAULT_EJ_LIMIT_ADDITION_INSTALLER_MS; /** * The period of time used to calculate expedited job sessions. Apps can only have expedited @@ -3369,7 +3413,8 @@ public final class QuotaController extends StateController { case KEY_EJ_LIMIT_FREQUENT_MS: case KEY_EJ_LIMIT_RARE_MS: case KEY_EJ_LIMIT_RESTRICTED_MS: - case KEY_EJ_LIMIT_SPECIAL_ADDITION_MS: + case KEY_EJ_LIMIT_ADDITION_SPECIAL_MS: + case KEY_EJ_LIMIT_ADDITION_INSTALLER_MS: case KEY_EJ_WINDOW_SIZE_MS: updateEJLimitConstantsLocked(); break; @@ -3704,7 +3749,8 @@ public final class QuotaController extends StateController { DeviceConfig.NAMESPACE_JOB_SCHEDULER, KEY_EJ_LIMIT_ACTIVE_MS, KEY_EJ_LIMIT_WORKING_MS, KEY_EJ_LIMIT_FREQUENT_MS, KEY_EJ_LIMIT_RARE_MS, - KEY_EJ_LIMIT_RESTRICTED_MS, KEY_EJ_LIMIT_SPECIAL_ADDITION_MS, + KEY_EJ_LIMIT_RESTRICTED_MS, KEY_EJ_LIMIT_ADDITION_SPECIAL_MS, + KEY_EJ_LIMIT_ADDITION_INSTALLER_MS, KEY_EJ_WINDOW_SIZE_MS); EJ_LIMIT_ACTIVE_MS = properties.getLong( KEY_EJ_LIMIT_ACTIVE_MS, DEFAULT_EJ_LIMIT_ACTIVE_MS); @@ -3716,8 +3762,10 @@ public final class QuotaController extends StateController { KEY_EJ_LIMIT_RARE_MS, DEFAULT_EJ_LIMIT_RARE_MS); EJ_LIMIT_RESTRICTED_MS = properties.getLong( KEY_EJ_LIMIT_RESTRICTED_MS, DEFAULT_EJ_LIMIT_RESTRICTED_MS); - EJ_LIMIT_SPECIAL_ADDITION_MS = properties.getLong( - KEY_EJ_LIMIT_SPECIAL_ADDITION_MS, DEFAULT_EJ_LIMIT_SPECIAL_ADDITION_MS); + EJ_LIMIT_ADDITION_INSTALLER_MS = properties.getLong( + KEY_EJ_LIMIT_ADDITION_INSTALLER_MS, DEFAULT_EJ_LIMIT_ADDITION_INSTALLER_MS); + EJ_LIMIT_ADDITION_SPECIAL_MS = properties.getLong( + KEY_EJ_LIMIT_ADDITION_SPECIAL_MS, DEFAULT_EJ_LIMIT_ADDITION_SPECIAL_MS); EJ_WINDOW_SIZE_MS = properties.getLong( KEY_EJ_WINDOW_SIZE_MS, DEFAULT_EJ_WINDOW_SIZE_MS); @@ -3763,11 +3811,17 @@ public final class QuotaController extends StateController { mEJLimitsMs[RESTRICTED_INDEX] = newRestrictedLimitMs; mShouldReevaluateConstraints = true; } - // The addition must be in the range [0 minutes, window size - active limit]. - long newSpecialAdditionMs = Math.max(0, - Math.min(newWindowSizeMs - newActiveLimitMs, EJ_LIMIT_SPECIAL_ADDITION_MS)); - if (mEjLimitSpecialAdditionMs != newSpecialAdditionMs) { - mEjLimitSpecialAdditionMs = newSpecialAdditionMs; + // The additions must be in the range [0 minutes, window size - active limit]. + long newAdditionInstallerMs = Math.max(0, + Math.min(newWindowSizeMs - newActiveLimitMs, EJ_LIMIT_ADDITION_INSTALLER_MS)); + if (mEjLimitAdditionInstallerMs != newAdditionInstallerMs) { + mEjLimitAdditionInstallerMs = newAdditionInstallerMs; + mShouldReevaluateConstraints = true; + } + long newAdditionSpecialMs = Math.max(0, + Math.min(newWindowSizeMs - newActiveLimitMs, EJ_LIMIT_ADDITION_SPECIAL_MS)); + if (mEjLimitAdditionSpecialMs != newAdditionSpecialMs) { + mEjLimitAdditionSpecialMs = newAdditionSpecialMs; mShouldReevaluateConstraints = true; } } @@ -3808,7 +3862,8 @@ public final class QuotaController extends StateController { pw.print(KEY_EJ_LIMIT_FREQUENT_MS, EJ_LIMIT_FREQUENT_MS).println(); pw.print(KEY_EJ_LIMIT_RARE_MS, EJ_LIMIT_RARE_MS).println(); pw.print(KEY_EJ_LIMIT_RESTRICTED_MS, EJ_LIMIT_RESTRICTED_MS).println(); - pw.print(KEY_EJ_LIMIT_SPECIAL_ADDITION_MS, EJ_LIMIT_SPECIAL_ADDITION_MS).println(); + pw.print(KEY_EJ_LIMIT_ADDITION_INSTALLER_MS, EJ_LIMIT_ADDITION_INSTALLER_MS).println(); + pw.print(KEY_EJ_LIMIT_ADDITION_SPECIAL_MS, EJ_LIMIT_ADDITION_SPECIAL_MS).println(); pw.print(KEY_EJ_WINDOW_SIZE_MS, EJ_WINDOW_SIZE_MS).println(); pw.print(KEY_EJ_TOP_APP_TIME_CHUNK_SIZE_MS, EJ_TOP_APP_TIME_CHUNK_SIZE_MS).println(); pw.print(KEY_EJ_REWARD_TOP_APP_MS, EJ_REWARD_TOP_APP_MS).println(); @@ -3945,8 +4000,13 @@ public final class QuotaController extends StateController { } @VisibleForTesting - long getEjLimitSpecialAdditionMs() { - return mEjLimitSpecialAdditionMs; + long getEjLimitAdditionInstallerMs() { + return mEjLimitAdditionInstallerMs; + } + + @VisibleForTesting + long getEjLimitAdditionSpecialMs() { + return mEjLimitAdditionSpecialMs; } @VisibleForTesting @@ -4067,6 +4127,12 @@ public final class QuotaController extends StateController { pw.decreaseIndent(); pw.println(); + pw.println("Special apps:"); + pw.increaseIndent(); + pw.print("System installers", mSystemInstallers.toString()); + pw.decreaseIndent(); + + pw.println(); mTrackedJobs.forEach((jobs) -> { for (int j = 0; j < jobs.size(); j++) { final JobStatus js = jobs.valueAt(j); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java index 56b30907b2a1..a33ba5b3f8bc 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java @@ -103,6 +103,10 @@ public abstract class StateController { public void onAppRemovedLocked(String packageName, int uid) { } + /** Called when a user is added to the device. */ + public void onUserAddedLocked(int userId) { + } + /** Called when a user is removed from the device. */ public void onUserRemovedLocked(int userId) { } diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index 1a808c9b3c33..24f7b37aedac 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1343,13 +1343,24 @@ public class AppStandbyController @Override public void restrictApp(@NonNull String packageName, int userId, @SystemForcedReasons int restrictReason) { + restrictApp(packageName, userId, REASON_MAIN_FORCED_BY_SYSTEM, restrictReason); + } + + @Override + public void restrictApp(@NonNull String packageName, int userId, int mainReason, + @SystemForcedReasons int restrictReason) { + if (mainReason != REASON_MAIN_FORCED_BY_SYSTEM + && mainReason != REASON_MAIN_FORCED_BY_USER) { + Slog.e(TAG, "Tried to restrict app " + packageName + " for an unsupported reason"); + return; + } // If the package is not installed, don't allow the bucket to be set. if (!mInjector.isPackageInstalled(packageName, 0, userId)) { Slog.e(TAG, "Tried to restrict uninstalled app: " + packageName); return; } - final int reason = REASON_MAIN_FORCED_BY_SYSTEM | (REASON_SUB_MASK & restrictReason); + final int reason = (REASON_MAIN_MASK & mainReason) | (REASON_SUB_MASK & restrictReason); final long nowElapsed = mInjector.elapsedRealtime(); final int bucket = mAllowRestrictedBucket ? STANDBY_BUCKET_RESTRICTED : STANDBY_BUCKET_RARE; setAppStandbyBucket(packageName, userId, bucket, reason, nowElapsed, false); diff --git a/apex/media/framework/api/system-current.txt b/apex/media/framework/api/system-current.txt index 1d912ebc71fa..ad681695ace5 100644 --- a/apex/media/framework/api/system-current.txt +++ b/apex/media/framework/api/system-current.txt @@ -18,11 +18,9 @@ package android.media { method @NonNull public android.net.Uri getSourceUri(); } - public static class MediaTranscodeManager.TranscodingRequest.MediaFormatResolver { - ctor public MediaTranscodeManager.TranscodingRequest.MediaFormatResolver(); + public static class MediaTranscodeManager.TranscodingRequest.VideoFormatResolver { + ctor public MediaTranscodeManager.TranscodingRequest.VideoFormatResolver(@NonNull android.media.ApplicationMediaCapabilities, @NonNull android.media.MediaFormat); method @Nullable public android.media.MediaFormat resolveVideoFormat(); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.MediaFormatResolver setClientCapabilities(@NonNull android.media.ApplicationMediaCapabilities); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.MediaFormatResolver setSourceVideoFormatHint(@NonNull android.media.MediaFormat); method public boolean shouldTranscode(); } @@ -34,7 +32,6 @@ package android.media { method public int getSessionId(); method public int getStatus(); method public void setOnProgressUpdateListener(@NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodeManager.TranscodingSession.OnProgressUpdateListener); - method public void setOnProgressUpdateListener(int, @NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodeManager.TranscodingSession.OnProgressUpdateListener); field public static final int ERROR_DROPPED_BY_SERVICE = 1; // 0x1 field public static final int ERROR_NONE = 0; // 0x0 field public static final int ERROR_SERVICE_DIED = 2; // 0x2 diff --git a/apex/media/framework/java/android/media/MediaTranscodeManager.java b/apex/media/framework/java/android/media/MediaTranscodeManager.java index 79e0d58cf495..7f4685ee053a 100644 --- a/apex/media/framework/java/android/media/MediaTranscodeManager.java +++ b/apex/media/framework/java/android/media/MediaTranscodeManager.java @@ -822,83 +822,102 @@ public final class MediaTranscodeManager { } /** - * Helper class for deciding if transcoding is needed, and if so, the track - * formats to use. + * Abstract base class for all the format resolvers. */ - public static class MediaFormatResolver { - private static final int BIT_RATE = 20000000; // 20Mbps + abstract static class MediaFormatResolver { + private @NonNull ApplicationMediaCapabilities mClientCaps; - private MediaFormat mSrcVideoFormatHint; - private MediaFormat mSrcAudioFormatHint; - private ApplicationMediaCapabilities mClientCaps; + /** + * Prevents public constructor access. + */ + /* package private */ MediaFormatResolver() { + } /** - * Sets the abilities of the client consuming the media. Must be called - * before {@link #shouldTranscode()} or {@link #resolveVideoFormat()}. + * Constructs MediaFormatResolver object. * * @param clientCaps An ApplicationMediaCapabilities object containing the client's * capabilities. - * @return the same VideoFormatResolver instance. */ - @NonNull - public MediaFormatResolver setClientCapabilities( - @NonNull ApplicationMediaCapabilities clientCaps) { + MediaFormatResolver(@NonNull ApplicationMediaCapabilities clientCaps) { + if (clientCaps == null) { + throw new IllegalArgumentException("Client capabilities must not be null"); + } mClientCaps = clientCaps; - return this; } /** - * Sets the video format hint about the source. Must be called before - * {@link #shouldTranscode()} or {@link #resolveVideoFormat()}. - * - * @param format A MediaFormat object containing information about the source's - * video track format that could affect the transcoding decision. - * Such information could include video codec types, color spaces, - * whether special format info (eg. slow-motion markers) are present, - * etc.. If a particular information is not present, it will not be - * used to make the decision. - * @return the same MediaFormatResolver instance. + * Returns the client capabilities. */ @NonNull - public MediaFormatResolver setSourceVideoFormatHint(@NonNull MediaFormat format) { - mSrcVideoFormatHint = format; - return this; + /* package */ ApplicationMediaCapabilities getClientCapabilities() { + return mClientCaps; } + abstract boolean shouldTranscode(); + } + + /** + * VideoFormatResolver for deciding if video transcoding is needed, and if so, the track + * formats to use. + */ + public static class VideoFormatResolver extends MediaFormatResolver { + private static final int BIT_RATE = 20000000; // 20Mbps + + private MediaFormat mSrcVideoFormatHint; + private MediaFormat mSrcAudioFormatHint; + /** - * Sets the audio format hint about the source. + * Constructs a new VideoFormatResolver object. * - * @param format A MediaFormat object containing information about the source's - * audio track format that could affect the transcoding decision. - * @return the same MediaFormatResolver instance. + * @param clientCaps An ApplicationMediaCapabilities object containing the client's + * capabilities. + * @param srcVideoFormatHint A MediaFormat object containing information about the + * source's video track format that could affect the + * transcoding decision. Such information could include video + * codec types, color spaces, whether special format info (eg. + * slow-motion markers) are present, etc.. If a particular + * information is not present, it will not be used to make the + * decision. + */ + public VideoFormatResolver(@NonNull ApplicationMediaCapabilities clientCaps, + @NonNull MediaFormat srcVideoFormatHint) { + super(clientCaps); + mSrcVideoFormatHint = srcVideoFormatHint; + } + + /** + * Constructs a new VideoFormatResolver object. + * + * @param clientCaps An ApplicationMediaCapabilities object containing the client's + * capabilities. + * @param srcVideoFormatHint A MediaFormat object containing information about the + * source's video track format that could affect the + * transcoding decision. Such information could include video + * codec types, color spaces, whether special format info (eg. + * slow-motion markers) are present, etc.. If a particular + * information is not present, it will not be used to make the + * decision. + * @param srcAudioFormatHint A MediaFormat object containing information about the + * source's audio track format that could affect the + * transcoding decision. * @hide */ - @NonNull - public MediaFormatResolver setSourceAudioFormatHint(@NonNull MediaFormat format) { - mSrcAudioFormatHint = format; - return this; + VideoFormatResolver(@NonNull ApplicationMediaCapabilities clientCaps, + @NonNull MediaFormat srcVideoFormatHint, + @NonNull MediaFormat srcAudioFormatHint) { + super(clientCaps); + mSrcVideoFormatHint = srcVideoFormatHint; + mSrcAudioFormatHint = srcAudioFormatHint; } /** * Returns whether the source content should be transcoded. * * @return true if the source should be transcoded. - * @throws UnsupportedOperationException - * if {@link #setClientCapabilities(ApplicationMediaCapabilities)} - * or {@link #setSourceVideoFormatHint(MediaFormat)} was not called. */ public boolean shouldTranscode() { - if (mClientCaps == null) { - throw new UnsupportedOperationException( - "Client caps must be set!"); - } - // Video src hint must be provided, audio src hint is not used right now. - if (mSrcVideoFormatHint == null) { - throw new UnsupportedOperationException( - "Source video format hint must be set!"); - } - - boolean supportHevc = mClientCaps.isVideoMimeTypeSupported( + boolean supportHevc = getClientCapabilities().isVideoMimeTypeSupported( MediaFormat.MIMETYPE_VIDEO_HEVC); if (!supportHevc && MediaFormat.MIMETYPE_VIDEO_HEVC.equals( mSrcVideoFormatHint.getString(MediaFormat.KEY_MIME))) { @@ -910,13 +929,11 @@ public final class MediaTranscodeManager { /** * Retrieves the video track format to be used on - * {@link Builder#setVideoTrackFormat(MediaFormat)} for this configuration. + * {@link VideoTranscodingRequest.Builder#setVideoTrackFormat(MediaFormat)} for this + * configuration. * * @return the video track format to be used if transcoding should be performed, * and null otherwise. - * @throws UnsupportedOperationException - * if {@link #setClientCapabilities(ApplicationMediaCapabilities)} - * or {@link #setSourceVideoFormatHint(MediaFormat)} was not called. */ @Nullable public MediaFormat resolveVideoFormat() { @@ -1015,9 +1032,6 @@ public final class MediaTranscodeManager { * * @return the audio track format to be used if transcoding should be performed, and * null otherwise. - * @throws UnsupportedOperationException - * if {@link #setClientCapabilities(ApplicationMediaCapabilities)} - * or {@link #setSourceVideoFormatHint(MediaFormat)} was not called. * @hide */ @Nullable @@ -1366,21 +1380,6 @@ public final class MediaTranscodeManager { public void setOnProgressUpdateListener( @NonNull @CallbackExecutor Executor executor, @Nullable OnProgressUpdateListener listener) { - setOnProgressUpdateListener( - 0 /* minProgressUpdateInterval */, - executor, listener); - } - - /** - * Set a progress listener with specified progress update interval. - * @param minProgressUpdateInterval The minimum interval between each progress update. - * @param executor The executor on which listener will be invoked. - * @param listener The progress listener. - */ - public void setOnProgressUpdateListener( - int minProgressUpdateInterval, - @NonNull @CallbackExecutor Executor executor, - @Nullable OnProgressUpdateListener listener) { synchronized (mLock) { Objects.requireNonNull(executor, "listenerExecutor must not be null"); Objects.requireNonNull(listener, "listener must not be null"); diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index f5bee6c0c724..260c8a47ea3c 100644 --- a/cmds/sm/src/com/android/commands/sm/Sm.java +++ b/cmds/sm/src/com/android/commands/sm/Sm.java @@ -258,7 +258,7 @@ public final class Sm { public void runDisableAppDataIsolation() throws RemoteException { if (!SystemProperties.getBoolean( - ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY, true)) { + ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY, false)) { throw new IllegalStateException("Storage app data isolation is not enabled."); } final String pkgName = nextArg(); diff --git a/core/api/current.txt b/core/api/current.txt index 481850e5c138..9dd3a4be049a 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -6943,6 +6943,7 @@ package android.app.admin { method @Nullable public String onChoosePrivateKeyAlias(@NonNull android.content.Context, @NonNull android.content.Intent, int, @Nullable android.net.Uri, @Nullable String); method public void onNetworkLogsAvailable(@NonNull android.content.Context, @NonNull android.content.Intent, long, @IntRange(from=1) int); method public final void onReceive(@NonNull android.content.Context, @NonNull android.content.Intent); + method public void onSecurityLogsAvailable(@NonNull android.content.Context, @NonNull android.content.Intent); } public final class DeviceAdminInfo implements android.os.Parcelable { @@ -7020,6 +7021,7 @@ package android.app.admin { field public static final String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; + field public static final String ACTION_SECURITY_LOGS_AVAILABLE = "android.app.action.SECURITY_LOGS_AVAILABLE"; field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0 field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1 field public static final String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; @@ -7315,6 +7317,7 @@ package android.app.admin { field public static final String DELEGATION_NETWORK_LOGGING = "delegation-network-logging"; field public static final String DELEGATION_PACKAGE_ACCESS = "delegation-package-access"; field public static final String DELEGATION_PERMISSION_GRANT = "delegation-permission-grant"; + field public static final String DELEGATION_SECURITY_LOGGING = "delegation-security-logging"; field public static final int ENCRYPTION_STATUS_ACTIVATING = 2; // 0x2 field public static final int ENCRYPTION_STATUS_ACTIVE = 3; // 0x3 field public static final int ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY = 4; // 0x4 @@ -8006,13 +8009,14 @@ package android.app.people { method public long getStartTimeMillis(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final int ACTIVITY_ANNIVERSARY = 2; // 0x2 + field public static final int ACTIVITY_AUDIO = 4; // 0x4 field public static final int ACTIVITY_BIRTHDAY = 1; // 0x1 - field public static final int ACTIVITY_GAME = 5; // 0x5 - field public static final int ACTIVITY_LOCATION = 6; // 0x6 - field public static final int ACTIVITY_MEDIA = 4; // 0x4 + field public static final int ACTIVITY_GAME = 6; // 0x6 + field public static final int ACTIVITY_LOCATION = 7; // 0x7 field public static final int ACTIVITY_NEW_STORY = 3; // 0x3 field public static final int ACTIVITY_OTHER = 0; // 0x0 - field public static final int ACTIVITY_UPCOMING_BIRTHDAY = 7; // 0x7 + field public static final int ACTIVITY_UPCOMING_BIRTHDAY = 8; // 0x8 + field public static final int ACTIVITY_VIDEO = 5; // 0x5 field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0 field public static final int AVAILABILITY_BUSY = 1; // 0x1 field public static final int AVAILABILITY_OFFLINE = 2; // 0x2 diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 92dada62b264..4be620652bb3 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1035,9 +1035,11 @@ package android.hardware.biometrics { public class BiometricPrompt { method @NonNull public java.util.List<java.lang.Integer> getAllowedSensorIds(); + method public boolean isAllowBackgroundAuthentication(); } public static class BiometricPrompt.Builder { + method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.TEST_BIOMETRIC, "android.permission.USE_BIOMETRIC_INTERNAL"}) public android.hardware.biometrics.BiometricPrompt.Builder setAllowBackgroundAuthentication(boolean); method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.TEST_BIOMETRIC, "android.permission.USE_BIOMETRIC_INTERNAL"}) public android.hardware.biometrics.BiometricPrompt.Builder setAllowedSensorIds(@NonNull java.util.List<java.lang.Integer>); } diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index c812e8e1782a..f7a35143916e 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -450,6 +450,21 @@ public abstract class ActivityManagerInternal { public abstract boolean hasRunningForegroundService(int uid, int foregroundServiceType); /** + * Returns {@code true} if the given notification channel currently has a + * notification associated with a foreground service. This is an AMS check + * because that is the source of truth for the FGS state. + */ + public abstract boolean hasForegroundServiceNotification(String pkg, @UserIdInt int userId, + String channelId); + + /** + * If the given app has any FGSs whose notifications are in the given channel, + * stop them. + */ + public abstract void stopForegroundServicesForChannel(String pkg, @UserIdInt int userId, + String channelId); + + /** * Registers the specified {@code processObserver} to be notified of future changes to * process state. */ diff --git a/core/java/android/app/admin/DelegatedAdminReceiver.java b/core/java/android/app/admin/DelegatedAdminReceiver.java index 25b8eab452bf..36097c928bb0 100644 --- a/core/java/android/app/admin/DelegatedAdminReceiver.java +++ b/core/java/android/app/admin/DelegatedAdminReceiver.java @@ -18,6 +18,7 @@ package android.app.admin; import static android.app.admin.DeviceAdminReceiver.ACTION_CHOOSE_PRIVATE_KEY_ALIAS; import static android.app.admin.DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE; +import static android.app.admin.DeviceAdminReceiver.ACTION_SECURITY_LOGS_AVAILABLE; import static android.app.admin.DeviceAdminReceiver.EXTRA_CHOOSE_PRIVATE_KEY_ALIAS; import static android.app.admin.DeviceAdminReceiver.EXTRA_CHOOSE_PRIVATE_KEY_SENDER_UID; import static android.app.admin.DeviceAdminReceiver.EXTRA_CHOOSE_PRIVATE_KEY_URI; @@ -115,6 +116,29 @@ public class DelegatedAdminReceiver extends BroadcastReceiver { } /** + * Called each time a new batch of security logs can be retrieved. This callback method will + * only ever be called when security logging is enabled. The logs can only be retrieved while + * security logging is enabled. + * + * <p>If a secondary user or profile is created, this callback won't be received until all users + * become affiliated again (even if security logging is enabled). It will also no longer be + * possible to retrieve the security logs. See {@link DevicePolicyManager#setAffiliationIds}. + * + * <p> This callback is only applicable if the delegated app has + * {@link DevicePolicyManager#DELEGATION_SECURITY_LOGGING} capability. Additionally, it must + * declare an intent filter for {@link DeviceAdminReceiver#ACTION_SECURITY_LOGS_AVAILABLE} in + * the receiver's manifest in order to receive this callback. The default implementation + * simply throws {@link UnsupportedOperationException}. + * + * @param context The running context as per {@link #onReceive}. + * @param intent The received intent as per {@link #onReceive}. + * @see DevicePolicyManager#retrieveSecurityLogs + */ + public void onSecurityLogsAvailable(@NonNull Context context, @NonNull Intent intent) { + throw new UnsupportedOperationException("onSecurityLogsAvailable should be implemented"); + } + + /** * Intercept delegated device administrator broadcasts. Implementations should not override * this method; implement the convenience callbacks for each action instead. */ @@ -132,6 +156,8 @@ public class DelegatedAdminReceiver extends BroadcastReceiver { long batchToken = intent.getLongExtra(EXTRA_NETWORK_LOGS_TOKEN, -1); int networkLogsCount = intent.getIntExtra(EXTRA_NETWORK_LOGS_COUNT, 0); onNetworkLogsAvailable(context, intent, batchToken, networkLogsCount); + } else if (ACTION_SECURITY_LOGS_AVAILABLE.equals(action)) { + onSecurityLogsAvailable(context, intent); } else { Log.w(TAG, "Unhandled broadcast: " + action); } diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java index cccc9294c2d5..747a2de80db0 100644 --- a/core/java/android/app/admin/DeviceAdminReceiver.java +++ b/core/java/android/app/admin/DeviceAdminReceiver.java @@ -290,7 +290,6 @@ public class DeviceAdminReceiver extends BroadcastReceiver { /** * Broadcast action: notify that a new batch of security logs is ready to be collected. - * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @BroadcastBehavior(explicitOnly = true) diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 594b0051a113..426159f43095 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1905,6 +1905,20 @@ public class DevicePolicyManager { public static final String DELEGATION_CERT_SELECTION = "delegation-cert-selection"; /** + * Grants access to {@link #setSecurityLoggingEnabled}, {@link #isSecurityLoggingEnabled}, + * {@link #retrieveSecurityLogs}, and {@link #retrievePreRebootSecurityLogs}. Once granted the + * delegated app will start receiving {@link DelegatedAdminReceiver#onSecurityLogsAvailable} + * callback, and Device owner or Profile Owner will no longer receive the + * {@link DeviceAdminReceiver#onSecurityLogsAvailable} callback. There can be at most one app + * that has this delegation. If another app already had delegated security logging access, it + * will lose the delegation when a new app is delegated. + * + * <p> Can only be granted by Device Owner or Profile Owner of an organnization owned and + * managed profile. + */ + public static final String DELEGATION_SECURITY_LOGGING = "delegation-security-logging"; + + /** * No management for current user in-effect. This is the default. * @hide */ @@ -11241,7 +11255,7 @@ public class DevicePolicyManager { public void setSecurityLoggingEnabled(@NonNull ComponentName admin, boolean enabled) { throwIfParentInstance("setSecurityLoggingEnabled"); try { - mService.setSecurityLoggingEnabled(admin, enabled); + mService.setSecurityLoggingEnabled(admin, mContext.getPackageName(), enabled); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } @@ -11260,7 +11274,7 @@ public class DevicePolicyManager { public boolean isSecurityLoggingEnabled(@Nullable ComponentName admin) { throwIfParentInstance("isSecurityLoggingEnabled"); try { - return mService.isSecurityLoggingEnabled(admin); + return mService.isSecurityLoggingEnabled(admin, mContext.getPackageName()); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } @@ -11285,10 +11299,12 @@ public class DevicePolicyManager { * @see #isAffiliatedUser * @see DeviceAdminReceiver#onSecurityLogsAvailable */ + @SuppressLint("NullableCollection") public @Nullable List<SecurityEvent> retrieveSecurityLogs(@NonNull ComponentName admin) { throwIfParentInstance("retrieveSecurityLogs"); try { - ParceledListSlice<SecurityEvent> list = mService.retrieveSecurityLogs(admin); + ParceledListSlice<SecurityEvent> list = mService.retrieveSecurityLogs( + admin, mContext.getPackageName()); if (list != null) { return list.getList(); } else { @@ -11438,11 +11454,13 @@ public class DevicePolicyManager { * @see #isAffiliatedUser * @see #retrieveSecurityLogs */ + @SuppressLint("NullableCollection") public @Nullable List<SecurityEvent> retrievePreRebootSecurityLogs( @NonNull ComponentName admin) { throwIfParentInstance("retrievePreRebootSecurityLogs"); try { - ParceledListSlice<SecurityEvent> list = mService.retrievePreRebootSecurityLogs(admin); + ParceledListSlice<SecurityEvent> list = mService.retrievePreRebootSecurityLogs( + admin, mContext.getPackageName()); if (list != null) { return list.getList(); } else { diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index e98720c0d96c..7901791fc7d4 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -386,10 +386,10 @@ interface IDevicePolicyManager { List<String> getAffiliationIds(in ComponentName admin); boolean isAffiliatedUser(); - void setSecurityLoggingEnabled(in ComponentName admin, boolean enabled); - boolean isSecurityLoggingEnabled(in ComponentName admin); - ParceledListSlice retrieveSecurityLogs(in ComponentName admin); - ParceledListSlice retrievePreRebootSecurityLogs(in ComponentName admin); + void setSecurityLoggingEnabled(in ComponentName admin, String packageName, boolean enabled); + boolean isSecurityLoggingEnabled(in ComponentName admin, String packageName); + ParceledListSlice retrieveSecurityLogs(in ComponentName admin, String packageName); + ParceledListSlice retrievePreRebootSecurityLogs(in ComponentName admin, String packageName); long forceNetworkLogs(); long forceSecurityLogs(); diff --git a/core/java/android/app/people/ConversationStatus.java b/core/java/android/app/people/ConversationStatus.java index d2a0255d572e..d351683386e2 100644 --- a/core/java/android/app/people/ConversationStatus.java +++ b/core/java/android/app/people/ConversationStatus.java @@ -36,7 +36,8 @@ public final class ConversationStatus implements Parcelable { ACTIVITY_BIRTHDAY, ACTIVITY_ANNIVERSARY, ACTIVITY_NEW_STORY, - ACTIVITY_MEDIA, + ACTIVITY_AUDIO, + ACTIVITY_VIDEO, ACTIVITY_GAME, ACTIVITY_LOCATION, ACTIVITY_UPCOMING_BIRTHDAY @@ -44,14 +45,47 @@ public final class ConversationStatus implements Parcelable { @Retention(RetentionPolicy.SOURCE) public @interface ActivityType {} + /** + * Constant representing that the conversation user is engaged in an activity that cannot be + * more specifically represented by another type. + */ public static final int ACTIVITY_OTHER = 0; + /** + * Constant representing that today is the conversation user's birthday. + */ public static final int ACTIVITY_BIRTHDAY = 1; + /** + * Constant representing that the conversation user and the device user are celebrating + * and anniversary today. + */ public static final int ACTIVITY_ANNIVERSARY = 2; + /** + * Constant representing that the conversation user has posted a new story. + */ public static final int ACTIVITY_NEW_STORY = 3; - public static final int ACTIVITY_MEDIA = 4; - public static final int ACTIVITY_GAME = 5; - public static final int ACTIVITY_LOCATION = 6; - public static final int ACTIVITY_UPCOMING_BIRTHDAY = 7; + /** + * Constant representing that the conversation user is listening to music or other audio + * like a podcast. + */ + public static final int ACTIVITY_AUDIO = 4; + /** + * Constant representing that the conversation user is watching video content. + */ + public static final int ACTIVITY_VIDEO = 5; + /** + * Constant representing that the conversation user is playing a game. + */ + public static final int ACTIVITY_GAME = 6; + /** + * Constant representing that the conversation user is sharing status with the device user. + * Use this to represent a general 'this person is sharing their location with you' status or + * a more specific 'this is the current location of this person' status. + */ + public static final int ACTIVITY_LOCATION = 7; + /** + * Constant representing that the conversation user's birthday is approaching soon. + */ + public static final int ACTIVITY_UPCOMING_BIRTHDAY = 8; /** @hide */ @IntDef(prefix = { "AVAILABILITY_" }, value = { diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index 31781ec79203..1db7e9da0bcb 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -1104,6 +1104,14 @@ public final class UsageStatsManager { break; case REASON_MAIN_FORCED_BY_USER: sb.append("f"); + if (subReason > 0) { + // Although not expected and shouldn't happen, this could potentially have a + // sub-reason if the system tries to give a reason when applying the + // FORCED_BY_USER reason. The sub-reason is undefined (though most likely a + // REASON_SUB_FORCED_SYSTEM_FLAG_ sub-reason), but it's better to note it in the + // log than to exclude it altogether. + sb.append("-").append(Integer.toBinaryString(subReason)); + } break; case REASON_MAIN_PREDICTED: sb.append("p"); diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 8fd0de7dbb39..a6b4b47f0db2 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -520,9 +520,7 @@ public class AppWidgetHostView extends FrameLayout { return; } int layoutId = rvToApply.getLayoutId(); - // If our stale view has been prepared to match active, and the new - // layout matches, try recycling it - if (content == null && layoutId == mLayoutId) { + if (rvToApply.canRecycleView(mView)) { try { rvToApply.reapply(mContext, mView, mInteractionHandler, mCurrentSize, mColorResources); diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java index 125824707402..2e51dc4427fe 100644 --- a/core/java/android/hardware/biometrics/BiometricPrompt.java +++ b/core/java/android/hardware/biometrics/BiometricPrompt.java @@ -368,6 +368,20 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } /** + * @param allow If true, allows authentication when the calling package is not in the + * foreground. This is set to false by default. + * @return This builder + * @hide + */ + @TestApi + @NonNull + @RequiresPermission(anyOf = {TEST_BIOMETRIC, USE_BIOMETRIC_INTERNAL}) + public Builder setAllowBackgroundAuthentication(boolean allow) { + mPromptInfo.setAllowBackgroundAuthentication(allow); + return this; + } + + /** * If set check the Device Policy Manager for disabled biometrics. * * @param checkDevicePolicyManager @@ -620,6 +634,15 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } /** + * @return The value set by {@link Builder#setAllowBackgroundAuthentication(boolean)} + * @hide + */ + @TestApi + public boolean isAllowBackgroundAuthentication() { + return mPromptInfo.isAllowBackgroundAuthentication(); + } + + /** * A wrapper class for the cryptographic operations supported by BiometricPrompt. * * <p>Currently the framework supports {@link Signature}, {@link Cipher}, {@link Mac}, and diff --git a/core/java/android/hardware/biometrics/ComponentInfoInternal.java b/core/java/android/hardware/biometrics/ComponentInfoInternal.java index fa34e0b4f0f2..3b61a56bd9f1 100644 --- a/core/java/android/hardware/biometrics/ComponentInfoInternal.java +++ b/core/java/android/hardware/biometrics/ComponentInfoInternal.java @@ -27,11 +27,11 @@ import android.os.Parcelable; */ public class ComponentInfoInternal implements Parcelable { - public final String componentId; - public final String hardwareVersion; - public final String firmwareVersion; - public final String serialNumber; - public final String softwareVersion; + @NonNull public final String componentId; + @NonNull public final String hardwareVersion; + @NonNull public final String firmwareVersion; + @NonNull public final String serialNumber; + @NonNull public final String softwareVersion; /** * Constructs a {@link ComponentInfoInternal} from another instance. @@ -45,8 +45,9 @@ public class ComponentInfoInternal implements Parcelable { /** * @hide */ - public ComponentInfoInternal(String componentId, String hardwareVersion, - String firmwareVersion, String serialNumber, String softwareVersion) { + public ComponentInfoInternal(@NonNull String componentId, @NonNull String hardwareVersion, + @NonNull String firmwareVersion, @NonNull String serialNumber, + @NonNull String softwareVersion) { this.componentId = componentId; this.hardwareVersion = hardwareVersion; this.firmwareVersion = firmwareVersion; diff --git a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl index 059bf2622b00..876513f266e8 100644 --- a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl +++ b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl @@ -48,7 +48,7 @@ interface IBiometricAuthenticator { // startPreparedClient(). void prepareForAuthentication(boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie); + int cookie, boolean allowBackgroundAuthentication); // Starts authentication with the previously prepared client. void startPreparedClient(int cookie); diff --git a/core/java/android/hardware/biometrics/PromptInfo.java b/core/java/android/hardware/biometrics/PromptInfo.java index 20c25fb82b4c..339c654f4d2f 100644 --- a/core/java/android/hardware/biometrics/PromptInfo.java +++ b/core/java/android/hardware/biometrics/PromptInfo.java @@ -44,6 +44,7 @@ public class PromptInfo implements Parcelable { private boolean mDisallowBiometricsIfPolicyExists; private boolean mReceiveSystemEvents; @NonNull private List<Integer> mAllowedSensorIds = new ArrayList<>(); + private boolean mAllowBackgroundAuthentication; public PromptInfo() { @@ -64,6 +65,7 @@ public class PromptInfo implements Parcelable { mDisallowBiometricsIfPolicyExists = in.readBoolean(); mReceiveSystemEvents = in.readBoolean(); mAllowedSensorIds = in.readArrayList(Integer.class.getClassLoader()); + mAllowBackgroundAuthentication = in.readBoolean(); } public static final Creator<PromptInfo> CREATOR = new Creator<PromptInfo>() { @@ -99,11 +101,14 @@ public class PromptInfo implements Parcelable { dest.writeBoolean(mDisallowBiometricsIfPolicyExists); dest.writeBoolean(mReceiveSystemEvents); dest.writeList(mAllowedSensorIds); + dest.writeBoolean(mAllowBackgroundAuthentication); } public boolean containsTestConfigurations() { if (!mAllowedSensorIds.isEmpty()) { return true; + } else if (mAllowBackgroundAuthentication) { + return true; } return false; } @@ -183,6 +188,10 @@ public class PromptInfo implements Parcelable { mAllowedSensorIds = sensorIds; } + public void setAllowBackgroundAuthentication(boolean allow) { + mAllowBackgroundAuthentication = allow; + } + // Getters public CharSequence getTitle() { @@ -248,4 +257,8 @@ public class PromptInfo implements Parcelable { public List<Integer> getAllowedSensorIds() { return mAllowedSensorIds; } + + public boolean isAllowBackgroundAuthentication() { + return mAllowBackgroundAuthentication; + } } diff --git a/core/java/android/hardware/biometrics/SensorPropertiesInternal.java b/core/java/android/hardware/biometrics/SensorPropertiesInternal.java index eda0ded42cdd..17b2abf9f5d1 100644 --- a/core/java/android/hardware/biometrics/SensorPropertiesInternal.java +++ b/core/java/android/hardware/biometrics/SensorPropertiesInternal.java @@ -34,7 +34,7 @@ public class SensorPropertiesInternal implements Parcelable { public final int sensorId; @SensorProperties.Strength public final int sensorStrength; public final int maxEnrollmentsPerUser; - public final List<ComponentInfoInternal> componentInfo; + @NonNull public final List<ComponentInfoInternal> componentInfo; public final boolean resetLockoutRequiresHardwareAuthToken; public final boolean resetLockoutRequiresChallenge; diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index a3c6f2f1eafd..b7b1a147c822 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -2030,7 +2030,9 @@ public final class CameraManager { // Tell listeners that the cameras and torch modes are unavailable and schedule a // reconnection to camera service. When camera service is reconnected, the camera // and torch statuses will be updated. - for (int i = 0; i < mDeviceStatus.size(); i++) { + // Iterate from the end to the beginning befcause onStatusChangedLocked removes + // entries from the ArrayMap. + for (int i = mDeviceStatus.size() - 1; i >= 0; i--) { String cameraId = mDeviceStatus.keyAt(i); onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, cameraId); } diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 2c3e7f18a3ab..6dd67447c321 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -20,6 +20,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import android.Manifest; import android.annotation.IntDef; +import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -376,6 +377,43 @@ public final class DisplayManager { @TestApi public static final int SWITCHING_TYPE_ACROSS_AND_WITHIN_GROUPS = 2; + /** + * @hide + */ + @LongDef(flag = true, prefix = {"EVENT_FLAG_"}, value = { + EVENT_FLAG_DISPLAY_ADDED, + EVENT_FLAG_DISPLAY_CHANGED, + EVENT_FLAG_DISPLAY_REMOVED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface EventsMask {} + + /** + * Event type for when a new display is added. + * + * @see #registerDisplayListener(DisplayListener, Handler, long) + * + * @hide + */ + public static final long EVENT_FLAG_DISPLAY_ADDED = 1L << 0; + + /** + * Event type for when a display is removed. + * + * @see #registerDisplayListener(DisplayListener, Handler, long) + * + * @hide + */ + public static final long EVENT_FLAG_DISPLAY_REMOVED = 1L << 1; + + /** + * Event type for when a display is changed. + * + * @see #registerDisplayListener(DisplayListener, Handler, long) + * + * @hide + */ + public static final long EVENT_FLAG_DISPLAY_CHANGED = 1L << 2; /** @hide */ public DisplayManager(Context context) { @@ -486,7 +524,7 @@ public final class DisplayManager { } /** - * Registers an display listener to receive notifications about when + * Registers a display listener to receive notifications about when * displays are added, removed or changed. * * @param listener The listener to register. @@ -496,7 +534,29 @@ public final class DisplayManager { * @see #unregisterDisplayListener */ public void registerDisplayListener(DisplayListener listener, Handler handler) { - mGlobal.registerDisplayListener(listener, handler); + registerDisplayListener(listener, handler, EVENT_FLAG_DISPLAY_ADDED + | EVENT_FLAG_DISPLAY_CHANGED | EVENT_FLAG_DISPLAY_REMOVED); + } + + /** + * Registers a display listener to receive notifications about given display event types. + * + * @param listener The listener to register. + * @param handler The handler on which the listener should be invoked, or null + * if the listener should be invoked on the calling thread's looper. + * @param eventsMask A bitmask of the event types for which this listener is subscribed. + * + * @see #EVENT_FLAG_DISPLAY_ADDED + * @see #EVENT_FLAG_DISPLAY_CHANGED + * @see #EVENT_FLAG_DISPLAY_REMOVED + * @see #registerDisplayListener(DisplayListener, Handler) + * @see #unregisterDisplayListener + * + * @hide + */ + public void registerDisplayListener(@NonNull DisplayListener listener, + @Nullable Handler handler, @EventsMask long eventsMask) { + mGlobal.registerDisplayListener(listener, handler, eventsMask); } /** diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index 60fe5825d6a1..fd0431c5bc3f 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -16,6 +16,9 @@ package android.hardware.display; +import static android.hardware.display.DisplayManager.EventsMask; + +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PropertyInvalidatedCache; @@ -42,6 +45,10 @@ import android.view.DisplayAdjustments; import android.view.DisplayInfo; import android.view.Surface; +import com.android.internal.annotations.VisibleForTesting; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -66,6 +73,14 @@ public final class DisplayManagerGlobal { // orientation change before the display info cache has actually been invalidated. private static final boolean USE_CACHE = false; + @IntDef(prefix = {"SWITCHING_TYPE_"}, value = { + EVENT_DISPLAY_ADDED, + EVENT_DISPLAY_CHANGED, + EVENT_DISPLAY_REMOVED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DisplayEvent {} + public static final int EVENT_DISPLAY_ADDED = 1; public static final int EVENT_DISPLAY_CHANGED = 2; public static final int EVENT_DISPLAY_REMOVED = 3; @@ -81,16 +96,17 @@ public final class DisplayManagerGlobal { private final IDisplayManager mDm; private DisplayManagerCallback mCallback; - private final ArrayList<DisplayListenerDelegate> mDisplayListeners = - new ArrayList<DisplayListenerDelegate>(); + private @EventsMask long mRegisteredEventsMask = 0; + private final ArrayList<DisplayListenerDelegate> mDisplayListeners = new ArrayList<>(); - private final SparseArray<DisplayInfo> mDisplayInfoCache = new SparseArray<DisplayInfo>(); + private final SparseArray<DisplayInfo> mDisplayInfoCache = new SparseArray<>(); private final ColorSpace mWideColorSpace; private int[] mDisplayIdCache; private int mWifiDisplayScanNestCount; - private DisplayManagerGlobal(IDisplayManager dm) { + @VisibleForTesting + public DisplayManagerGlobal(IDisplayManager dm) { mDm = dm; try { mWideColorSpace = @@ -274,18 +290,25 @@ public final class DisplayManagerGlobal { * If that is still null, a runtime exception will be thrown. */ public void registerDisplayListener(@NonNull DisplayListener listener, - @Nullable Handler handler) { + @Nullable Handler handler, @EventsMask long eventsMask) { if (listener == null) { throw new IllegalArgumentException("listener must not be null"); } + if (eventsMask == 0) { + throw new IllegalArgumentException("The set of events to listen to must not be empty."); + } + synchronized (mLock) { int index = findDisplayListenerLocked(listener); if (index < 0) { Looper looper = getLooperForHandler(handler); - mDisplayListeners.add(new DisplayListenerDelegate(listener, looper)); + mDisplayListeners.add(new DisplayListenerDelegate(listener, looper, eventsMask)); registerCallbackIfNeededLocked(); + } else { + mDisplayListeners.get(index).setEventsMask(eventsMask); } + updateCallbackIfNeededLocked(); } } @@ -300,6 +323,7 @@ public final class DisplayManagerGlobal { DisplayListenerDelegate d = mDisplayListeners.get(index); d.clearEvents(); mDisplayListeners.remove(index); + updateCallbackIfNeededLocked(); } } } @@ -325,18 +349,36 @@ public final class DisplayManagerGlobal { return -1; } + @EventsMask + private int calculateEventsMaskLocked() { + int mask = 0; + final int numListeners = mDisplayListeners.size(); + for (int i = 0; i < numListeners; i++) { + mask |= mDisplayListeners.get(i).mEventsMask; + } + return mask; + } + private void registerCallbackIfNeededLocked() { if (mCallback == null) { mCallback = new DisplayManagerCallback(); + updateCallbackIfNeededLocked(); + } + } + + private void updateCallbackIfNeededLocked() { + int mask = calculateEventsMaskLocked(); + if (mask != mRegisteredEventsMask) { try { - mDm.registerCallback(mCallback); + mDm.registerCallbackWithEventMask(mCallback, mask); + mRegisteredEventsMask = mask; } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } } - private void handleDisplayEvent(int displayId, int event) { + private void handleDisplayEvent(int displayId, @DisplayEvent int event) { synchronized (mLock) { if (USE_CACHE) { mDisplayInfoCache.remove(displayId); @@ -754,7 +796,7 @@ public final class DisplayManagerGlobal { private final class DisplayManagerCallback extends IDisplayManagerCallback.Stub { @Override - public void onDisplayEvent(int displayId, int event) { + public void onDisplayEvent(int displayId, @DisplayEvent int event) { if (DEBUG) { Log.d(TAG, "onDisplayEvent: displayId=" + displayId + ", event=" + event); } @@ -764,13 +806,16 @@ public final class DisplayManagerGlobal { private static final class DisplayListenerDelegate extends Handler { public final DisplayListener mListener; + public long mEventsMask; - DisplayListenerDelegate(DisplayListener listener, @NonNull Looper looper) { + DisplayListenerDelegate(DisplayListener listener, @NonNull Looper looper, + @EventsMask long eventsMask) { super(looper, null, true /*async*/); mListener = listener; + mEventsMask = eventsMask; } - public void sendDisplayEvent(int displayId, int event) { + public void sendDisplayEvent(int displayId, @DisplayEvent int event) { Message msg = obtainMessage(event, displayId, 0); sendMessage(msg); } @@ -779,17 +824,27 @@ public final class DisplayManagerGlobal { removeCallbacksAndMessages(null); } + public synchronized void setEventsMask(@EventsMask long newEventsMask) { + mEventsMask = newEventsMask; + } + @Override - public void handleMessage(Message msg) { + public synchronized void handleMessage(Message msg) { switch (msg.what) { case EVENT_DISPLAY_ADDED: - mListener.onDisplayAdded(msg.arg1); + if ((mEventsMask & DisplayManager.EVENT_FLAG_DISPLAY_ADDED) != 0) { + mListener.onDisplayAdded(msg.arg1); + } break; case EVENT_DISPLAY_CHANGED: - mListener.onDisplayChanged(msg.arg1); + if ((mEventsMask & DisplayManager.EVENT_FLAG_DISPLAY_CHANGED) != 0) { + mListener.onDisplayChanged(msg.arg1); + } break; case EVENT_DISPLAY_REMOVED: - mListener.onDisplayRemoved(msg.arg1); + if ((mEventsMask & DisplayManager.EVENT_FLAG_DISPLAY_REMOVED) != 0) { + mListener.onDisplayRemoved(msg.arg1); + } break; } } diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl index ff8a7208a9f0..dee91445c224 100644 --- a/core/java/android/hardware/display/IDisplayManager.aidl +++ b/core/java/android/hardware/display/IDisplayManager.aidl @@ -38,6 +38,7 @@ interface IDisplayManager { boolean isUidPresentOnDisplay(int uid, int displayId); void registerCallback(in IDisplayManagerCallback callback); + void registerCallbackWithEventMask(in IDisplayManagerCallback callback, long eventsMask); // Requires CONFIGURE_WIFI_DISPLAY permission. // The process must have previously registered a callback. diff --git a/core/java/android/hardware/face/FaceSensorProperties.java b/core/java/android/hardware/face/FaceSensorProperties.java index 6ddea5017088..f61312785919 100644 --- a/core/java/android/hardware/face/FaceSensorProperties.java +++ b/core/java/android/hardware/face/FaceSensorProperties.java @@ -17,6 +17,7 @@ package android.hardware.face; import android.annotation.IntDef; +import android.annotation.NonNull; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; @@ -74,7 +75,8 @@ public class FaceSensorProperties extends SensorProperties { * @hide */ public FaceSensorProperties(int sensorId, int sensorStrength, - List<ComponentInfo> componentInfo, @FaceSensorProperties.SensorType int sensorType) { + @NonNull List<ComponentInfo> componentInfo, + @FaceSensorProperties.SensorType int sensorType) { super(sensorId, sensorStrength, componentInfo); mSensorType = sensorType; } diff --git a/core/java/android/hardware/face/FaceSensorPropertiesInternal.java b/core/java/android/hardware/face/FaceSensorPropertiesInternal.java index 50ea60a2ff57..44dffb207731 100644 --- a/core/java/android/hardware/face/FaceSensorPropertiesInternal.java +++ b/core/java/android/hardware/face/FaceSensorPropertiesInternal.java @@ -16,6 +16,7 @@ package android.hardware.face; +import android.annotation.NonNull; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; import android.hardware.biometrics.SensorPropertiesInternal; @@ -48,7 +49,7 @@ public class FaceSensorPropertiesInternal extends SensorPropertiesInternal { * Initializes SensorProperties with specified values */ public FaceSensorPropertiesInternal(int sensorId, @SensorProperties.Strength int strength, - int maxEnrollmentsPerUser, List<ComponentInfoInternal> componentInfo, + int maxEnrollmentsPerUser, @NonNull List<ComponentInfoInternal> componentInfo, @FaceSensorProperties.SensorType int sensorType, boolean supportsFaceDetection, boolean supportsSelfIllumination, boolean resetLockoutRequiresChallenge) { // resetLockout is managed by the HAL and requires a HardwareAuthToken for all face diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index 6e7c701ef5ff..0b44150afa4d 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -59,7 +59,7 @@ interface IFaceService { // startPreparedClient(). void prepareForAuthentication(int sensorId, boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie); + int cookie, boolean allowBackgroundAuthentication); // Starts authentication with the previously prepared client. void startPreparedClient(int sensorId, int cookie); diff --git a/core/java/android/hardware/fingerprint/FingerprintSensorProperties.java b/core/java/android/hardware/fingerprint/FingerprintSensorProperties.java index a3385752aaf3..71b705faba79 100644 --- a/core/java/android/hardware/fingerprint/FingerprintSensorProperties.java +++ b/core/java/android/hardware/fingerprint/FingerprintSensorProperties.java @@ -17,6 +17,7 @@ package android.hardware.fingerprint; import android.annotation.IntDef; +import android.annotation.NonNull; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; @@ -94,7 +95,7 @@ public class FingerprintSensorProperties extends SensorProperties { * @hide */ public FingerprintSensorProperties(int sensorId, int sensorStrength, - List<ComponentInfo> componentInfo, @SensorType int sensorType) { + @NonNull List<ComponentInfo> componentInfo, @SensorType int sensorType) { super(sensorId, sensorStrength, componentInfo); mSensorType = sensorType; } diff --git a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java index 1b1337072f5e..58f6e62af320 100644 --- a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java +++ b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java @@ -62,7 +62,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna public FingerprintSensorPropertiesInternal(int sensorId, @SensorProperties.Strength int strength, int maxEnrollmentsPerUser, - List<ComponentInfoInternal> componentInfo, + @NonNull List<ComponentInfoInternal> componentInfo, @FingerprintSensorProperties.SensorType int sensorType, boolean resetLockoutRequiresHardwareAuthToken, int sensorLocationX, int sensorLocationY, int sensorRadius) { @@ -83,7 +83,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna */ public FingerprintSensorPropertiesInternal(int sensorId, @SensorProperties.Strength int strength, int maxEnrollmentsPerUser, - List<ComponentInfoInternal> componentInfo, + @NonNull List<ComponentInfoInternal> componentInfo, @FingerprintSensorProperties.SensorType int sensorType, boolean resetLockoutRequiresHardwareAuthToken) { // TODO(b/179175438): Value should be provided from the HAL @@ -99,7 +99,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna // TODO(b/179175438): Remove this constructor once all HALs move to AIDL. public FingerprintSensorPropertiesInternal(@NonNull Context context, int sensorId, @SensorProperties.Strength int strength, int maxEnrollmentsPerUser, - List<ComponentInfoInternal> componentInfo, + @NonNull List<ComponentInfoInternal> componentInfo, @FingerprintSensorProperties.SensorType int sensorType, boolean resetLockoutRequiresHardwareAuthToken) { super(sensorId, strength, maxEnrollmentsPerUser, componentInfo, diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index 054c0d0f6513..469e87e2390a 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -62,7 +62,8 @@ interface IFingerprintService { // by BiometricService. To start authentication after the clients are ready, use // startPreparedClient(). void prepareForAuthentication(int sensorId, IBinder token, long operationId, int userId, - IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie); + IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, + boolean allowBackgroundAuthentication); // Starts authentication with the previously prepared client. void startPreparedClient(int sensorId, int cookie); diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java index eaa8bd403e24..f69a7d7e5f16 100644 --- a/core/java/android/hardware/location/ContextHubManager.java +++ b/core/java/android/hardware/location/ContextHubManager.java @@ -60,8 +60,8 @@ public final class ContextHubManager { private static final String TAG = "ContextHubManager"; /** - * An extra containing an int from {@link AuthorizationState} describing the client's - * authorization state. + * An extra containing one of the {@code AUTHORIZATION_*} constants such as + * {@link #AUTHORIZATION_GRANTED} describing the client's authorization state. */ public static final String EXTRA_CLIENT_AUTHORIZATION_STATE = "android.hardware.location.extra.CLIENT_AUTHORIZATION_STATE"; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index f1c80af54cba..52517b07f861 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -15806,6 +15806,7 @@ public final class Settings { * 1: Enabled (All apps will receive the new rules) * @hide */ + @Readable public static final String BACKPORT_S_NOTIF_RULES = "backport_s_notif_rules"; /** diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 0167147a1067..85d4878d044c 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -105,7 +105,6 @@ public final class SurfaceControl implements Parcelable { private static native void nativeMergeTransaction(long transactionObj, long otherTransactionObj); private static native void nativeSetAnimationTransaction(long transactionObj); - private static native void nativeSetEarlyWakeup(long transactionObj); private static native void nativeSetEarlyWakeupStart(long transactionObj); private static native void nativeSetEarlyWakeupEnd(long transactionObj); @@ -3175,23 +3174,6 @@ public final class SurfaceControl implements Parcelable { return this; } - /** - * @deprecated use {@link Transaction#setEarlyWakeupStart()} - * - * Indicate that SurfaceFlinger should wake up earlier than usual as a result of this - * transaction. This should be used when the caller thinks that the scene is complex enough - * that it's likely to hit GL composition, and thus, SurfaceFlinger needs to more time in - * order not to miss frame deadlines. - * <p> - * Corresponds to setting ISurfaceComposer::eEarlyWakeup - * @hide - */ - @Deprecated - public Transaction setEarlyWakeup() { - nativeSetEarlyWakeup(mNativeObject); - return this; - } - /** * Provides a hint to SurfaceFlinger to change its offset so that SurfaceFlinger wakes up * earlier to compose surfaces. The caller should use this as a hint to SurfaceFlinger diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 2b73923fc5f4..319e78807684 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -2196,7 +2196,7 @@ public class RemoteViews implements Parcelable, Filter { int recycledViewIndex = findViewIndexToRecycle(target, rvToApply); if (recycledViewIndex >= 0) { View child = target.getChildAt(recycledViewIndex); - if (getViewLayoutId(child) == rvToApply.getLayoutId()) { + if (rvToApply.canRecycleView(child)) { if (nextChild < recycledViewIndex) { target.removeViews(nextChild, recycledViewIndex - nextChild); } @@ -2254,7 +2254,7 @@ public class RemoteViews implements Parcelable, Filter { // application are placed before. ViewTree recycled = target.mChildren.get(recycledViewIndex); // We can only recycle the view if the layout id is the same. - if (getViewLayoutId(recycled.mRoot) == rvToApply.getLayoutId()) { + if (rvToApply.canRecycleView(recycled.mRoot)) { if (recycledViewIndex > nextChild) { target.removeChildren(nextChild, recycledViewIndex - nextChild); } @@ -3726,7 +3726,8 @@ public class RemoteViews implements Parcelable, Filter { * * The {@code stableId} will be used to identify a potential view to recycled when the remote * view is inflated. Views can be re-used if inserted in the same order, potentially with - * some views appearing / disappearing. + * some views appearing / disappearing. To be recycled the view must not change the layout + * used to inflate it or its view id (see {@link RemoteViews#setViewId}). * * Note: if a view is re-used, all the actions will be re-applied on it. However, its properties * are not reset, so what was applied in previous round will have an effect. As a view may be @@ -5116,6 +5117,7 @@ public class RemoteViews implements Parcelable, Filter { View v = inflater.inflate(rv.getLayoutId(), parent, false); if (mViewId != View.NO_ID) { v.setId(mViewId); + v.setTagInternal(R.id.remote_views_override_id, mViewId); } v.setTagInternal(R.id.widget_frame, rv.getLayoutId()); return v; @@ -5335,6 +5337,24 @@ public class RemoteViews implements Parcelable, Filter { reapply(context, v, handler, size, colorResources, true); } + /** @hide */ + public boolean canRecycleView(@Nullable View v) { + if (v == null) { + return false; + } + Integer previousLayoutId = (Integer) v.getTag(R.id.widget_frame); + if (previousLayoutId == null) { + return false; + } + Integer overrideIdTag = (Integer) v.getTag(R.id.remote_views_override_id); + int overrideId = overrideIdTag == null ? View.NO_ID : overrideIdTag; + // If mViewId is View.NO_ID, we only recycle if overrideId is also View.NO_ID. + // Otherwise, it might be that, on a previous iteration, the view's ID was set to + // something else, and it should now be reset to the ID defined in the XML layout file, + // whatever it is. + return previousLayoutId == getLayoutId() && mViewId == overrideId; + } + // Note: topLevel should be true only for calls on the topLevel RemoteViews, internal calls // should set it to false. private void reapply(Context context, View v, InteractionHandler handler, SizeF size, @@ -5347,7 +5367,7 @@ public class RemoteViews implements Parcelable, Filter { // (orientation or size), we throw an exception, since the layouts may be completely // unrelated. if (hasMultipleLayouts()) { - if ((Integer) v.getTag(R.id.widget_frame) != rvToApply.getLayoutId()) { + if (!rvToApply.canRecycleView(v)) { throw new RuntimeException("Attempting to re-apply RemoteViews to a view that" + " that does not share the same root layout id."); } diff --git a/core/java/com/android/internal/app/OWNERS b/core/java/com/android/internal/app/OWNERS index 7ade05cc6de1..e6c911e5b41d 100644 --- a/core/java/com/android/internal/app/OWNERS +++ b/core/java/com/android/internal/app/OWNERS @@ -3,6 +3,9 @@ per-file *Resolver* = file:/packages/SystemUI/OWNERS per-file *Chooser* = file:/packages/SystemUI/OWNERS per-file SimpleIconFactory.java = file:/packages/SystemUI/OWNERS per-file NetInitiatedActivity.java = file:/location/java/android/location/OWNERS -per-file IVoice* = file:/core/java/android/service/voice/OWNERS -per-file *Hotword* = file:/core/java/android/service/voice/OWNERS per-file *BatteryStats* = file:/BATTERY_STATS_OWNERS + +# Voice Interaction +per-file *Assist* = file:/core/java/android/service/voice/OWNERS +per-file *Hotword* = file:/core/java/android/service/voice/OWNERS +per-file *Voice* = file:/core/java/android/service/voice/OWNERS diff --git a/core/java/com/android/internal/widget/ViewPager.java b/core/java/com/android/internal/widget/ViewPager.java index 6f377b9b228a..93cde3ddb72d 100644 --- a/core/java/com/android/internal/widget/ViewPager.java +++ b/core/java/com/android/internal/widget/ViewPager.java @@ -353,8 +353,8 @@ public class ViewPager extends ViewGroup { mTouchSlop = configuration.getScaledPagingTouchSlop(); mMinimumVelocity = (int) (MIN_FLING_VELOCITY * density); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); - mLeftEdge = new EdgeEffect(context); - mRightEdge = new EdgeEffect(context); + mLeftEdge = new EdgeEffect(context, attrs); + mRightEdge = new EdgeEffect(context, attrs); mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density); mCloseEnough = (int) (CLOSE_ENOUGH * density); @@ -387,6 +387,28 @@ public class ViewPager extends ViewGroup { } /** + * Returns the {@link EdgeEffect#getType()} for the edge effects. + * @return the {@link EdgeEffect#getType()} for the edge effects. + * @attr ref android.R.styleable#EdgeEffect_edgeEffectType + */ + @EdgeEffect.EdgeEffectType + public int getEdgeEffectType() { + // Both left and right edge have the same edge effect type + return mLeftEdge.getType(); + } + + /** + * Sets the {@link EdgeEffect#setType(int)} for the edge effects. + * @param type The edge effect type to use for the edge effects. + * @attr ref android.R.styleable#EdgeEffect_edgeEffectType + */ + public void setEdgeEffectType(@EdgeEffect.EdgeEffectType int type) { + mLeftEdge.setType(type); + mRightEdge.setType(type); + invalidate(); + } + + /** * Set a PagerAdapter that will supply views for this pager as needed. * * @param adapter Adapter to use @@ -1891,7 +1913,7 @@ public class ViewPager extends ViewGroup { } if (mIsBeingDragged) { // Scroll to follow the motion event - if (performDrag(x)) { + if (performDrag(x, y)) { postInvalidateOnAnimation(); } } @@ -1918,6 +1940,17 @@ public class ViewPager extends ViewGroup { mIsBeingDragged = true; requestParentDisallowInterceptTouchEvent(true); setScrollState(SCROLL_STATE_DRAGGING); + } else if (mLeftEdge.getDistance() != 0 + || mRightEdge.getDistance() != 0) { + // Caught the edge glow animation + mIsBeingDragged = true; + setScrollState(SCROLL_STATE_DRAGGING); + if (mLeftEdge.getDistance() != 0) { + mLeftEdge.onPullDistance(0f, 1 - mLastMotionY / getHeight()); + } + if (mRightEdge.getDistance() != 0) { + mRightEdge.onPullDistance(0f, mLastMotionY / getHeight()); + } } else { completeScroll(false); mIsBeingDragged = false; @@ -2009,7 +2042,7 @@ public class ViewPager extends ViewGroup { // Scroll to follow the motion event final int activePointerIndex = ev.findPointerIndex(mActivePointerId); final float x = ev.getX(activePointerIndex); - needsInvalidate |= performDrag(x); + needsInvalidate |= performDrag(x, ev.getY(activePointerIndex)); } break; case MotionEvent.ACTION_UP: @@ -2080,12 +2113,43 @@ public class ViewPager extends ViewGroup { } } - private boolean performDrag(float x) { + /** + * If either of the horizontal edge glows are currently active, this consumes part or all of + * deltaX on the edge glow. + * + * @param deltaX The pointer motion, in pixels, in the horizontal direction, positive + * for moving down and negative for moving up. + * @param y The vertical position of the pointer. + * @return The amount of <code>deltaX</code> that has been consumed by the + * edge glow. + */ + private float releaseHorizontalGlow(float deltaX, float y) { + // First allow releasing existing overscroll effect: + float consumed = 0; + float displacement = y / getHeight(); + float pullDistance = (float) deltaX / getWidth(); + if (mLeftEdge.getDistance() != 0) { + consumed = -mLeftEdge.onPullDistance(-pullDistance, 1 - displacement); + } else if (mRightEdge.getDistance() != 0) { + consumed = mRightEdge.onPullDistance(pullDistance, displacement); + } + return consumed * getWidth(); + } + + private boolean performDrag(float x, float y) { boolean needsInvalidate = false; + final float dX = mLastMotionX - x; final int width = getPaddedWidth(); - final float deltaX = mLastMotionX - x; mLastMotionX = x; + final float releaseConsumed = releaseHorizontalGlow(dX, y); + final float deltaX = dX - releaseConsumed; + if (releaseConsumed != 0) { + needsInvalidate = true; + } + if (Math.abs(deltaX) < 0.0001f) { // ignore rounding errors from releaseHorizontalGlow() + return needsInvalidate; + } final EdgeEffect startEdge; final EdgeEffect endEdge; @@ -2128,14 +2192,14 @@ public class ViewPager extends ViewGroup { if (scrollStart < startBound) { if (startAbsolute) { final float over = startBound - scrollStart; - startEdge.onPull(Math.abs(over) / width); + startEdge.onPullDistance(over / width, 1 - y / getHeight()); needsInvalidate = true; } clampedScrollStart = startBound; } else if (scrollStart > endBound) { if (endAbsolute) { final float over = scrollStart - endBound; - endEdge.onPull(Math.abs(over) / width); + endEdge.onPullDistance(over / width, y / getHeight()); needsInvalidate = true; } clampedScrollStart = endBound; @@ -2228,7 +2292,9 @@ public class ViewPager extends ViewGroup { */ private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) { int targetPage; - if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) { + if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity + && mLeftEdge.getDistance() == 0 // don't fling while stretched + && mRightEdge.getDistance() == 0) { targetPage = currentPage - (velocity < 0 ? mLeftIncr : 0); } else { final float truncator = currentPage >= mCurItem ? 0.4f : 0.6f; diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 65b8b988f38b..f54ffc50095b 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -498,19 +498,14 @@ static void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz, jlong trans transaction->setAnimationTransaction(); } -static void nativeSetEarlyWakeup(JNIEnv* env, jclass clazz, jlong transactionObj) { - auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); - transaction->setEarlyWakeup(); -} - static void nativeSetEarlyWakeupStart(JNIEnv* env, jclass clazz, jlong transactionObj) { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); - transaction->setExplicitEarlyWakeupStart(); + transaction->setEarlyWakeupStart(); } static void nativeSetEarlyWakeupEnd(JNIEnv* env, jclass clazz, jlong transactionObj) { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); - transaction->setExplicitEarlyWakeupEnd(); + transaction->setEarlyWakeupEnd(); } static void nativeSetLayer(JNIEnv* env, jclass clazz, jlong transactionObj, @@ -1737,8 +1732,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeMergeTransaction }, {"nativeSetAnimationTransaction", "(J)V", (void*)nativeSetAnimationTransaction }, - {"nativeSetEarlyWakeup", "(J)V", - (void*)nativeSetEarlyWakeup }, {"nativeSetEarlyWakeupStart", "(J)V", (void*)nativeSetEarlyWakeupStart }, {"nativeSetEarlyWakeupEnd", "(J)V", diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index be17d92b78ba..0bed29b7ba28 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -825,7 +825,7 @@ static void MountEmulatedStorage(uid_t uid, jint mount_mode, PrepareDir(user_source, 0710, user_id ? AID_ROOT : AID_SHELL, multiuser_get_uid(user_id, AID_EVERYBODY), fail_fn); - bool isAppDataIsolationEnabled = GetBoolProperty(kVoldAppDataIsolation, true); + bool isAppDataIsolationEnabled = GetBoolProperty(kVoldAppDataIsolation, false); if (mount_mode == MOUNT_EXTERNAL_PASS_THROUGH) { const std::string pass_through_source = StringPrintf("/mnt/pass_through/%d", user_id); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index f6fee880bf2f..b0327a5decee 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -59,6 +59,7 @@ <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item> <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item> <item><xliff:g id="id">@string/status_bar_no_calling</xliff:g></item> + <item><xliff:g id="id">@string/status_bar_call_strength</xliff:g></item> <item><xliff:g id="id">@string/status_bar_battery</xliff:g></item> <item><xliff:g id="id">@string/status_bar_sensors_off</xliff:g></item> </string-array> @@ -96,6 +97,7 @@ <string translatable="false" name="status_bar_camera">camera</string> <string translatable="false" name="status_bar_airplane">airplane</string> <string translatable="false" name="status_bar_no_calling">no_calling</string> + <string translatable="false" name="status_bar_call_strength">call_strength</string> <string translatable="false" name="status_bar_sensors_off">sensors_off</string> <string translatable="false" name="status_bar_screen_record">screen_record</string> diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml index 7bc4663d1070..c3b35c81cb66 100644 --- a/core/res/res/values/ids.xml +++ b/core/res/res/values/ids.xml @@ -252,5 +252,8 @@ <item type="id" name="remote_views_next_child" /> <!-- View tag associating a view with its stable id for potential recycling. --> - <item type="id" name = "remote_views_stable_id" /> + <item type="id" name="remote_views_stable_id" /> + + <!-- View tag associating a view with its overridden id, to ensure valid recycling only. --> + <item type="id" name="remote_views_override_id" /> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 0228dfd45972..7ea762c2fbbb 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4592,7 +4592,7 @@ <string name="color_correction_feature_name">Color Correction</string> <!-- Title of Reduce Brightness feature, shown in the warning dialog about the accessibility shortcut. [CHAR LIMIT=none] --> - <string name="reduce_bright_colors_feature_name">Reduce brightness</string> + <string name="reduce_bright_colors_feature_name">Extra dim</string> <!-- Text in toast to alert the user that the accessibility shortcut turned on an accessibility service. [CHAR LIMIT=none] --> <string name="accessibility_shortcut_enabling_service">Held volume keys. <xliff:g id="service_name" example="TalkBack">%1$s</xliff:g> turned on.</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0f834933ab70..cdeb71c7f162 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2977,6 +2977,7 @@ <java-symbol type="string" name="status_bar_clock" /> <java-symbol type="string" name="status_bar_airplane" /> <java-symbol type="string" name="status_bar_no_calling" /> + <java-symbol type="string" name="status_bar_call_strength" /> <java-symbol type="string" name="status_bar_mobile" /> <java-symbol type="string" name="status_bar_ethernet" /> <java-symbol type="string" name="status_bar_vpn" /> @@ -3390,6 +3391,8 @@ <java-symbol type="drawable" name="ic_accessibility_color_correction" /> <java-symbol type="drawable" name="ic_accessibility_magnification" /> + <java-symbol type="string" name="reduce_bright_colors_feature_name" /> + <!-- com.android.internal.widget.RecyclerView --> <java-symbol type="id" name="item_touch_helper_previous_elevation"/> <java-symbol type="dimen" name="item_touch_helper_max_drag_scroll_per_frame"/> @@ -4321,8 +4324,11 @@ <java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed" /> <java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default" /> + <!-- Ids for RemoteViews --> <java-symbol type="id" name="remote_views_next_child" /> <java-symbol type="id" name="remote_views_stable_id" /> + <java-symbol type="id" name="remote_views_override_id" /> + <!-- View and control prompt --> <java-symbol type="drawable" name="ic_accessibility_24dp" /> <java-symbol type="string" name="view_and_control_notification_title" /> diff --git a/core/tests/coretests/BstatsTestApp/AndroidManifest.xml b/core/tests/coretests/BstatsTestApp/AndroidManifest.xml index 1e6bdc6c29a0..fcb1e71cc3f5 100644 --- a/core/tests/coretests/BstatsTestApp/AndroidManifest.xml +++ b/core/tests/coretests/BstatsTestApp/AndroidManifest.xml @@ -19,7 +19,7 @@ <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> - <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="25"/> + <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26"/> <application> <activity android:name=".TestActivity" diff --git a/core/tests/coretests/src/android/hardware/display/DisplayManagerGlobalTest.java b/core/tests/coretests/src/android/hardware/display/DisplayManagerGlobalTest.java new file mode 100644 index 000000000000..dfc9013e3c05 --- /dev/null +++ b/core/tests/coretests/src/android/hardware/display/DisplayManagerGlobalTest.java @@ -0,0 +1,127 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.display; + +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; + +import android.content.Context; +import android.os.Handler; +import android.os.RemoteException; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class DisplayManagerGlobalTest { + + private static final long ALL_DISPLAY_EVENTS = DisplayManager.EVENT_FLAG_DISPLAY_ADDED + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED + | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED; + + @Mock + private IDisplayManager mDisplayManager; + + @Mock + private DisplayManager.DisplayListener mListener; + + @Captor + private ArgumentCaptor<IDisplayManagerCallback> mCallbackCaptor; + + private Context mContext; + private DisplayManagerGlobal mDisplayManagerGlobal; + private Handler mHandler; + + @Before + public void setUp() throws RemoteException { + MockitoAnnotations.initMocks(this); + Mockito.when(mDisplayManager.getPreferredWideGamutColorSpaceId()).thenReturn(0); + mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + mHandler = mContext.getMainThreadHandler(); + mDisplayManagerGlobal = new DisplayManagerGlobal(mDisplayManager); + } + + @Test + public void testDisplayListenerIsCalled_WhenDisplayEventOccurs() throws RemoteException { + mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, ALL_DISPLAY_EVENTS); + Mockito.verify(mDisplayManager) + .registerCallbackWithEventMask(mCallbackCaptor.capture(), anyLong()); + IDisplayManagerCallback callback = mCallbackCaptor.getValue(); + + int displayId = 1; + callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_ADDED); + waitForHandler(); + Mockito.verify(mListener).onDisplayAdded(eq(displayId)); + Mockito.verifyNoMoreInteractions(mListener); + + Mockito.reset(mListener); + callback.onDisplayEvent(1, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED); + waitForHandler(); + Mockito.verify(mListener).onDisplayChanged(eq(displayId)); + Mockito.verifyNoMoreInteractions(mListener); + + Mockito.reset(mListener); + callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED); + waitForHandler(); + Mockito.verify(mListener).onDisplayRemoved(eq(displayId)); + Mockito.verifyNoMoreInteractions(mListener); + } + + @Test + public void testDisplayListenerIsNotCalled_WhenClientIsNotSubscribed() throws RemoteException { + // First we subscribe to all events in order to test that the subsequent calls to + // registerDisplayListener will update the event mask. + mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, ALL_DISPLAY_EVENTS); + Mockito.verify(mDisplayManager) + .registerCallbackWithEventMask(mCallbackCaptor.capture(), anyLong()); + IDisplayManagerCallback callback = mCallbackCaptor.getValue(); + + int displayId = 1; + mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, + ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_ADDED); + callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_ADDED); + waitForHandler(); + Mockito.verifyZeroInteractions(mListener); + + mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, + ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_CHANGED); + callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED); + waitForHandler(); + Mockito.verifyZeroInteractions(mListener); + + mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, + ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_REMOVED); + callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED); + waitForHandler(); + Mockito.verifyZeroInteractions(mListener); + } + + private void waitForHandler() { + mHandler.runWithScissors(() -> { }, 0); + } +} diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java index 4fe7d70e86ff..13d529cfed26 100644 --- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java @@ -124,6 +124,7 @@ public class BstatsCpuTimesValidationTest { sContext.getPackageManager().setApplicationEnabledSetting(TEST_PKG, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0); sTestPkgUid = sContext.getPackageManager().getPackageUid(TEST_PKG, 0); + executeCmd("cmd deviceidle whitelist +" + TEST_PKG); final ArrayMap<String, String> desiredConstants = new ArrayMap<>(); desiredConstants.put(KEY_TRACK_CPU_TIMES_BY_PROC_STATE, Boolean.toString(true)); @@ -134,6 +135,7 @@ public class BstatsCpuTimesValidationTest { @AfterClass public static void tearDownOnce() throws Exception { + executeCmd("cmd deviceidle whitelist -" + TEST_PKG); if (sBatteryStatsConstsUpdated) { Settings.Global.putString(sContext.getContentResolver(), Settings.Global.BATTERY_STATS_CONSTANTS, sOriginalBatteryStatsConsts); @@ -382,7 +384,7 @@ public class BstatsCpuTimesValidationTest { } @Test - @SkipPresubmit("b/180015146 flakey") + @SkipPresubmit("b/183225190 flaky") public void testCpuFreqTimes_stateFgService() throws Exception { if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) { Log.w(TAG, "Skipping " + testName.getMethodName() @@ -515,7 +517,6 @@ public class BstatsCpuTimesValidationTest { } @Test - @SkipPresubmit("b/180015146") public void testCpuFreqTimes_trackingDisabled() throws Exception { if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) { Log.w(TAG, "Skipping " + testName.getMethodName() @@ -625,7 +626,7 @@ public class BstatsCpuTimesValidationTest { splitter.setString(settingsDump); String next; while (splitter.hasNext()) { - next = splitter.next(); + next = splitter.next().trim(); if (next.startsWith(key)) { return next.split("=")[1]; } diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 9b124ced5663..1924e5fd7941 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -493,6 +493,8 @@ applications that come with the platform <!-- Permission required for hotword detection service CTS tests --> <permission name="android.permission.MANAGE_HOTWORD_DETECTION" /> <permission name="android.permission.MANAGE_APP_HIBERNATION"/> + <!-- Permission required for CTS test - ResourceObserverNativeTest --> + <permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" /> </privapp-permissions> <privapp-permissions package="com.android.statementservice"> diff --git a/graphics/java/android/graphics/drawable/RippleAnimationSession.java b/graphics/java/android/graphics/drawable/RippleAnimationSession.java index b57f7af14a0e..94d5c2265372 100644 --- a/graphics/java/android/graphics/drawable/RippleAnimationSession.java +++ b/graphics/java/android/graphics/drawable/RippleAnimationSession.java @@ -26,8 +26,8 @@ import android.graphics.CanvasProperty; import android.graphics.Paint; import android.graphics.RecordingCanvas; import android.graphics.animation.RenderNodeAnimator; -import android.util.ArraySet; import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.view.animation.PathInterpolator; @@ -41,8 +41,8 @@ public final class RippleAnimationSession { private static final int ENTER_ANIM_DURATION = 450; private static final int EXIT_ANIM_DURATION = 300; private static final TimeInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); - private static final TimeInterpolator PATH_INTERPOLATOR = - new PathInterpolator(.2f, 0, 0, 1f); + private static final Interpolator FAST_OUT_LINEAR_IN = + new PathInterpolator(0.4f, 0f, 1f, 1f); private Consumer<RippleAnimationSession> mOnSessionEnd; private final AnimationProperties<Float, Paint> mProperties; private AnimationProperties<CanvasProperty<Float>, CanvasProperty<Paint>> mCanvasProperties; @@ -59,7 +59,7 @@ public final class RippleAnimationSession { mSparkle.addUpdateListener(anim -> { final long now = AnimationUtils.currentAnimationTimeMillis(); final long elapsed = now - mStartTime - ENTER_ANIM_DURATION; - final float phase = (float) elapsed / 30000f; + final float phase = (float) elapsed / 800; mProperties.getShader().setNoisePhase(phase); notifyUpdate(); }); @@ -174,7 +174,7 @@ public final class RippleAnimationSession { private void startAnimation(Animator expand) { expand.setDuration(ENTER_ANIM_DURATION); expand.addListener(new AnimatorListener(this)); - expand.setInterpolator(LINEAR_INTERPOLATOR); + expand.setInterpolator(FAST_OUT_LINEAR_IN); expand.start(); if (!mSparkle.isRunning()) { mSparkle.start(); diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index fb2b9b343f0a..d5711c8cc450 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -914,7 +914,7 @@ public class RippleDrawable extends LayerDrawable { shader.setColor(color); shader.setOrigin(w / 2, y / 2); shader.setTouch(x, y); - shader.setResolution(w, h); + shader.setResolution(w, h, mState.mDensity); shader.setNoisePhase(0); shader.setRadius(radius); shader.setProgress(.0f); diff --git a/graphics/java/android/graphics/drawable/RippleShader.java b/graphics/java/android/graphics/drawable/RippleShader.java index ea9ba325a826..5dd250c8239e 100644 --- a/graphics/java/android/graphics/drawable/RippleShader.java +++ b/graphics/java/android/graphics/drawable/RippleShader.java @@ -20,13 +20,15 @@ import android.annotation.ColorInt; import android.graphics.Color; import android.graphics.RuntimeShader; import android.graphics.Shader; +import android.util.DisplayMetrics; final class RippleShader extends RuntimeShader { private static final String SHADER_UNIFORMS = "uniform vec2 in_origin;\n" + "uniform vec2 in_touch;\n" + "uniform float in_progress;\n" + "uniform float in_maxRadius;\n" - + "uniform vec2 in_resolution;\n" + + "uniform vec2 in_resolutionScale;\n" + + "uniform vec2 in_noiseScale;\n" + "uniform float in_hasMask;\n" + "uniform float in_noisePhase;\n" + "uniform vec4 in_color;\n" @@ -40,18 +42,15 @@ final class RippleShader extends RuntimeShader { + "}" + "const float PI = 3.1415926535897932384626;\n" + "\n" - + "float threshold(float v, float l, float h) {\n" - + " return step(l, v) * (1.0 - step(h, v));\n" - + "}\n" - + "\n" + "float sparkles(vec2 uv, float t) {\n" + " float n = triangleNoise(uv);\n" + " float s = 0.0;\n" + " for (float i = 0; i < 4; i += 1) {\n" - + " float l = i * 0.25;\n" - + " float h = l + 0.005;\n" - + " float o = abs(sin(0.1 * PI * (t + i)));\n" - + " s += threshold(n + o, l, h);\n" + + " float l = i * 0.01;\n" + + " float h = l + 0.1;\n" + + " float o = smoothstep(n - l, h, n);\n" + + " o *= abs(sin(PI * o * (t + 0.55 * i)));\n" + + " s += o;\n" + " }\n" + " return saturate(s);\n" + "}\n" @@ -83,7 +82,9 @@ final class RippleShader extends RuntimeShader { + " vec2 center = mix(in_touch, in_origin, fadeIn);\n" + " float ring = getRingMask(p, center, in_maxRadius, fadeIn);\n" + " float alpha = min(fadeIn, 1. - fadeOutNoise);\n" - + " float sparkle = sparkles(p, in_noisePhase) * ring * alpha;\n" + + " vec2 uv = p * in_resolutionScale;\n" + + " vec2 densityUv = uv - mod(uv, in_noiseScale);\n" + + " float sparkle = sparkles(densityUv, in_noisePhase) * ring * alpha;\n" + " float fade = min(fadeIn, 1. - fadeOutRipple);\n" + " vec4 circle = in_color * (softCircle(p, center, in_maxRadius " + " * fadeIn, 0.2) * fade);\n" @@ -135,7 +136,10 @@ final class RippleShader extends RuntimeShader { color.green(), color.blue(), color.alpha()}); } - public void setResolution(float w, float h) { - setUniform("in_resolution", w, h); + public void setResolution(float w, float h, int density) { + float noiseScale = 0.8f; + float densityScale = density * DisplayMetrics.DENSITY_DEFAULT_SCALE * 0.5f * noiseScale; + setUniform("in_resolutionScale", new float[] {1f / w, 1f / h}); + setUniform("in_noiseScale", new float[] {densityScale / w, densityScale / h}); } } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index d7112d6dfa63..0d613992f300 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -612,7 +612,9 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, } /** - * Sets the context the record belongs to. + * Sets the context the record belongs to. This context will be used to pull information, + * such as attribution tags, which will be associated with the AudioRecord. However, the + * context itself will not be retained by the AudioRecord. * @param context a non-null {@link Context} instance * @return the same Builder instance. */ diff --git a/packages/Connectivity/framework/src/android/net/InetAddressCompat.java b/packages/Connectivity/framework/src/android/net/InetAddressCompat.java index 8404441de669..6b7e75c75359 100644 --- a/packages/Connectivity/framework/src/android/net/InetAddressCompat.java +++ b/packages/Connectivity/framework/src/android/net/InetAddressCompat.java @@ -41,7 +41,12 @@ public class InetAddressCompat { public static void clearDnsCache() { try { InetAddress.class.getMethod("clearDnsCache").invoke(null); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + } catch (InvocationTargetException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw new IllegalStateException("Unknown InvocationTargetException", e.getCause()); + } catch (IllegalAccessException | NoSuchMethodException e) { Log.wtf(InetAddressCompat.class.getSimpleName(), "Error clearing DNS cache", e); } } @@ -51,13 +56,7 @@ public class InetAddressCompat { */ public static InetAddress[] getAllByNameOnNet(String host, int netId) throws UnknownHostException { - try { - return (InetAddress[]) InetAddress.class.getMethod("getAllByNameOnNet", - String.class, int.class).invoke(null, host, netId); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - Log.wtf(InetAddressCompat.class.getSimpleName(), "Error calling getAllByNameOnNet", e); - throw new IllegalStateException("Error querying via getAllNameOnNet", e); - } + return (InetAddress[]) callGetByNameMethod("getAllByNameOnNet", host, netId); } /** @@ -65,12 +64,25 @@ public class InetAddressCompat { */ public static InetAddress getByNameOnNet(String host, int netId) throws UnknownHostException { + return (InetAddress) callGetByNameMethod("getByNameOnNet", host, netId); + } + + private static Object callGetByNameMethod(String method, String host, int netId) + throws UnknownHostException { try { - return (InetAddress) InetAddress.class.getMethod("getByNameOnNet", - String.class, int.class).invoke(null, host, netId); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - Log.wtf(InetAddressCompat.class.getSimpleName(), "Error calling getAllByNameOnNet", e); - throw new IllegalStateException("Error querying via getByNameOnNet", e); + return InetAddress.class.getMethod(method, String.class, int.class) + .invoke(null, host, netId); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof UnknownHostException) { + throw (UnknownHostException) e.getCause(); + } + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw new IllegalStateException("Unknown InvocationTargetException", e.getCause()); + } catch (IllegalAccessException | NoSuchMethodException e) { + Log.wtf(InetAddressCompat.class.getSimpleName(), "Error calling " + method, e); + throw new IllegalStateException("Error querying via " + method, e); } } } diff --git a/packages/Connectivity/service/ServiceConnectivityResources/res/values/strings.xml b/packages/Connectivity/service/ServiceConnectivityResources/res/values/strings.xml index 7a9cf57afcd6..b2fa5f5b4129 100644 --- a/packages/Connectivity/service/ServiceConnectivityResources/res/values/strings.xml +++ b/packages/Connectivity/service/ServiceConnectivityResources/res/values/strings.xml @@ -68,8 +68,6 @@ <item>VPN</item> </string-array> - <!-- Network type names used in the network_switch_metered and network_switch_metered_detail strings. These must be kept in the sync with the values NetworkCapabilities.TRANSPORT_xxx values, and in the same order. --> - <!-- Network type name displayed if one of the types is not found in network_switch_type_name. --> <string name="network_switch_type_name_unknown">an unknown network type</string> diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 68ce7d963242..d6c66b5663af 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -17,8 +17,8 @@ android_library { // TODO(b/149540986): revert this change. static_libs: [ - // All other dependent components should be put in - // "SettingsLibDependenciesWithoutWifiTracker". + // All other dependent components should be put in + // "SettingsLibDependenciesWithoutWifiTracker". "WifiTrackerLib", ], @@ -27,10 +27,7 @@ android_library { resource_dirs: ["res"], - srcs: [ - "src/**/*.java", - "src/**/*.kt", - ], + srcs: ["src/**/*.java", "src/**/*.kt"], min_sdk_version: "21", diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 0ee44f81cd0e..7cf8cda9e8b2 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rooi-groen)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (blou-geel)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Kleurregstelling"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Verstel hoe kleure op jou toestel vertoon. Dit kan nuttig wees wanneer jy:<br/><br/> <ol> <li> Kleure meer akkuraat wil sien</li> <li> Kleure wil verwyder om jou te help fokus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Verstel hoe kleure op jou toestel vertoon. Dit kan nuttig wees wanneer jy:<br/><br/> <ol> <li>&nbsp;Kleure meer akkuraat wil sien</li> <li>&nbsp;Kleure wil verwyder om jou te help fokus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Geneutraliseer deur <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 9fb676fc3456..d3e4d1cabee3 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ፕሮታኖማሊ (ቀይ-አረንጓዴ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ትራይታኖማሊ (ሰማያዊ-ቢጫ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"የቀለም ማስተካከያ"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ቀለሞች በመሣሪያዎ ላይ እንዴት እንደሚታዩ ያስተካክሉ። የሚከተሉትን ለማድረግ በሚፈልጉበት ጊዜ ይህ ጠቃሚ ሊሆን ይችላል፦<br/><br/> <ol> <li> ቀለሞችን የበለጠ ትክክለኛ በሆነ መልኩ ለመመልከት</li> <li> ትኩረት ለማድረግ እንዲረዳዎ ቀለሞችን ለማስወገድ</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"ቀለሞች በመሣሪያዎ ላይ እንዴት እንደሚታዩ ያስተካክሉ። የሚከተሉትን ለማድረግ በሚፈልጉበት ጊዜ ይህ ጠቃሚ ሊሆን ይችላል፦<br/><br/> <ol> <li>&nbsp;ቀለሞችን የበለጠ ትክክለኛ በሆነ መልኩ ለመመልከት</li> <li>&nbsp;ትኩረት ለማድረግ እንዲረዳዎ ቀለሞችን ለማስወገድ</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"በ<xliff:g id="TITLE">%1$s</xliff:g> ተሽሯል"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ገደማ ቀርቷል"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index cdb418aa4b54..ca613f93741a 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"غطش الأحمر (الأحمر والأخضر)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"غمش الأزرق (الأزرق والأصفر)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"تصحيح الألوان"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"يمكنك تعديل كيفية عرض الألوان على جهازك. يساعدك هذا الخيار عندما تريد تنفيذ ما يلي:<br/><br/> <ol> <li> عرض الألوان بمزيد من الدقة</li> <li> إزالة الألوان لمساعدتك على التركيز</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"يمكنك تعديل كيفية عرض الألوان على جهازك. يساعدك هذا الخيار عندما تريد تنفيذ ما يلي:<br/><br/> <ol> <li>&nbsp;عرض الألوان بمزيد من الدقة</li> <li>&nbsp;إزالة الألوان لمساعدتك على التركيز</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"تم الاستبدال بـ <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا"</string> @@ -570,7 +570,7 @@ <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"مفعّل"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"يجب إعادة تشغيل جهازك ليتم تطبيق هذا التغيير. يمكنك إعادة التشغيل الآن أو إلغاء التغيير."</string> <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"سمّاعة سلكية"</string> - <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"تفعيل"</string> + <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"مفعّلة"</string> <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"إيقاف"</string> <string name="carrier_network_change_mode" msgid="4257621815706644026">"جارٍ تغيير شبكة مشغِّل شبكة الجوّال."</string> <string name="data_connection_3g" msgid="931852552688157407">"شبكة الجيل الثالث"</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 442a19da2971..603755760865 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"প্ৰ’টানোমালি (ৰঙা-সেউজীয়া)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ট্ৰাইটান\'মেলী (নীলা-হালধীয়া)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ৰং শুধৰণী"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"আপোনাৰ ডিভাইচত ৰংবোৰ কেনেকৈ প্ৰদৰ্শিত হয় সেয়া মিলাওক। এইটো আপুনি এই কাৰ্য কৰিবলৈ বিচাৰিলে সহায়ক হ\'ব পাৰে:<br/><br/> <ol> <li> ৰং অধিক সঠিককৈ চাবলৈ বিচৰা</li> <li> আপোনাক মনোযোগ দিয়াত সহায় কৰিবলৈ ৰং আঁতৰোৱা</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"আপোনাৰ ডিভাইচত ৰংবোৰ কেনেকৈ প্ৰদৰ্শিত হয় সেয়া মিলাওক। আপুনি এয়া কৰিবলৈ বিচাৰিলে এইটো সহায়ক হ’ব পাৰে:<br/><br/> <ol> <li>&nbsp;ৰংবোৰ অধিক সঠিকভাৱে চোৱা</li> <li>&nbsp;আপোনাক মনোনিৱেশ কৰাৰ ক্ষেত্ৰত সহায় কৰিবলৈ ৰং আঁতৰোৱা</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g>ৰ দ্বাৰা অগ্ৰাহ্য কৰা হৈছে"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 2b0fa86499bc..97ae1924ff23 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaliya (qırmızı-yaşıl)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaliya (göy-sarı)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Rəng düzəlişi"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Cihazınızda rənglərin necə göstərilməsini tənzimləyin. Bu, aşağıdakıları etmək istədikdə faydalı ola bilər:<br/><br/> <ol> <li> Rəngləri daha dəqiq görmək</li> <li> Fokuslanmaq üçün rəngləri ləğv etmək</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Cihazınızda rənglərin necə göstərilməsini tənzimləyin. Bu, aşağıdakıları etmək istədikdə faydalı ola bilər:<br/><br/> <ol> <li>&nbsp;Rəngləri daha dəqiq görmək</li> <li>&nbsp;Fokuslanmaq üçün rəngləri ləğv etmək</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> tərəfindən qəbul edilmir"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index b3186376ad59..6bed4057dfb6 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (crveno-zeleno)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (plavo-žuto)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekcija boja"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Prilagodite način na koji se boje prikazuju na uređaju. To može da bude korisno kada želite:<br/><br/> <ol> <li> da vam se boje tačnije prikazuju</li> <li> da uklonite boje kako biste se fokusirali</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Prilagodite način na koji se boje prikazuju na uređaju. To može da bude korisno kada želite:<br/><br/> <ol> <li>&nbsp;da vam se boje tačnije prikazuju</li> <li>&nbsp;da uklonite boje kako biste se fokusirali</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Zamenjuje ga <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>–<xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 950a5ae71cb5..029d355cb312 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Пратанамалія (чырвоны-зялёны)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Трытанамалія (сіні-жоўты)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Карэкцыя колеру"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Наладзьце адлюстраванне колераў на экране прылады. Гэта налада можа быць карыснай, калі вы захочаце:<br/><br/> <ol> <li> бачыць колеры больш дакладна;</li> <li> выдаліць колеры, якія перашкаджаюць вам сканцэнтравацца</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Наладзьце адлюстраванне колераў на экране прылады. Гэта налада можа быць карыснай, калі вы захочаце:<br/><br/> <ol> <li>&nbsp;бачыць колеры больш дакладна;</li> <li>&nbsp;выдаліць колеры, якія перашкаджаюць вам сканцэнтравацца</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Перавызначаны <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Зараду хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 9ff2531c0e7c..032b433601a6 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (червено – зелено)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (синьо – жълто)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекция на цветове"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Коригирайте как цветовете се показват на устройството ви. Това може да бъде полезно, когато искате да:<br/><br/> <ol> <li> видите цветовете по-ясно;</li> <li> премахнете цветовете, за да се фокусирате.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Коригирайте как цветовете се показват на устройството ви. Това може да бъде полезно, когато искате:<br/><br/> <ol> <li>&nbsp;да видите цветовете по-ясно;</li> <li>&nbsp;да премахнете цветовете, за да се фокусирате.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Заменено от „<xliff:g id="TITLE">%1$s</xliff:g>“"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 4cc9abf7f0b3..331dfee975f1 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"প্রোটানোম্যালি (লাল-সবুজ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ট্রিট্যানোম্যালি (নীল-হলুদ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"রঙ সংশোধন"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"আপনার ডিভাইসে রঙগুলি কেমন দেখাবে তা অ্যাডজাস্ট করুন। যেক্ষেত্রে এটি আপনাকে সহায়তা করতে পারে:<br/><br/> <ol> <li> আরও নির্ভুলভাবে রঙ দেখতে</li> <li> রঙ সরিয়ে দিলে ফোকাস করতে সহায়তা করবে</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"আপনার ডিভাইসে রঙগুলি কেমন দেখাবে তা অ্যাডজাস্ট করুন। যেক্ষেত্রে এটি আপনাকে সহায়তা করতে পারে:<br/><br/> <ol> <li>&nbsp;আরও নির্ভুলভাবে রঙ দেখতে</li> <li>&nbsp;রঙ সরিয়ে দিয়ে ফোকাস করতে সহায়তা করবে</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> এর দ্বারা ওভাররাইড করা হয়েছে"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index e4bc5a199f87..08c31ba342b8 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (crveno-zeleno)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (plavo-žuto)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Ispravka boje"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Podešavanje načina na koji se boje prikazuju na uređaju. To može biti korisno kada želite:<br/><br/> <ol> <li> tačnije prikazati boje</li> <li> ukloniti boje da se lakše fokusirate</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Podešavanje načina na koji se boje prikazuju na uređaju. To može biti korisno kada želite:<br/><br/> <ol> <li>&nbsp;preciznije prikazati boje</li> <li>&nbsp;ukloniti boje da se lakše fokusirate</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index fa441a208b66..13a90c3c5f48 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermell-verd)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (blau-groc)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correcció de color"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajusta com es mostren els colors al teu dispositiu. Això pot ser útil quan vulguis:<br/><br/> <ol> <li> Veure els colors amb més claredat.</li> <li> Suprimir colors per poder enfocar més fàcilment.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajusta com es mostren els colors al teu dispositiu. Això pot ser útil quan vulguis:<br/><br/> <ol> <li>&nbsp;Veure els colors amb més claredat.</li> <li>&nbsp;Suprimir colors per poder concentrar-te.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"S\'ha substituït per <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>: <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Temps restant aproximat: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 717b6817f767..8598ecc044aa 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomálie (červená a zelená)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomálie (modrá a žlutá)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekce barev"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Upravte zobrazování barev na svém zařízení. To se může hodit, když chcete:<br/><br/> <ol> <li> Aby se barvy zobrazovaly přesněji</li> <li> Odstranit barvy, abyste se mohli lépe soustředit</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Upravte zobrazování barev na svém zařízení. To se může hodit, když chcete:<br/><br/> <ol> <li>&nbsp;Zobrazovat barvy přesněji</li> <li>&nbsp;Odstranit barvy, abyste se mohli lépe soustředit</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Přepsáno nastavením <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 6b17db1137d9..d17924f9ac56 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanopi (rød-grøn)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanopi (blå-gul)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korriger farver"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Juster, hvordan farverne vises på skærmen. Dette kan være nyttigt, når du vil:<br/><br/> <ol> <li> Se farver mere nøjagtigt</li> <li> Fjerne farver, så du bedre kan fokusere</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Juster, hvordan farverne vises på din enhed. Dette kan være nyttigt, når du vil:<br/><br/> <ol> <li>&nbsp;Se farver mere nøjagtigt</li> <li>&nbsp;Fjerne farver, så du bedre kan fokusere</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Tilsidesat af <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index bb11ed10ad1d..a0bf4b16f482 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (Rot-Grün-Sehschwäche)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (Blau-Gelb-Sehschwäche)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Farbkorrektur"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Hier kannst du anpassen, wie Farben auf deinem Gerät dargestellt werden sollen. Das kann in folgenden Fällen hilfreich sein:<br/><br/> <ol> <li> Wenn Farben genauer dargestellt werden sollen</li> <li> Wenn du Farben entfernen möchtest, um dich besser konzentrieren zu können</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Außer Kraft gesetzt von \"<xliff:g id="TITLE">%1$s</xliff:g>\""</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 76faa4c13617..5e4d52ea3934 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Πρωτανοπία (κόκκινο-πράσινο)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Τριτανοπία (μπλε-κίτρινο)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Διόρθωση χρωμάτων"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Προσαρμόστε πώς θα εμφανίζονται τα χρώματα στη συσκευή σας. Αυτό μπορεί να είναι χρήσιμο όταν θέλετε:<br/><br/> <ol> <li> Να βλέπετε τα χρώματα με μεγαλύτερη ακρίβεια</li> <li> Να καταργήσετε τα χρώματα για να συγκεντρωθείτε</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Προσαρμόστε πώς θα εμφανίζονται τα χρώματα στη συσκευή σας. Αυτό μπορεί να είναι χρήσιμο όταν θέλετε:<br/><br/> <ol> <li>&nbsp;Να βλέπετε τα χρώματα με μεγαλύτερη ακρίβεια</li> <li>&nbsp;Να καταργήσετε τα χρώματα για να συγκεντρωθείτε</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Αντικαταστάθηκε από <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 9a63404229a5..8dfcb401f179 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li> See colours more accurately</li> <li> Remove colours to help you focus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li>&nbsp;See colours more accurately</li> <li>&nbsp;Remove colours to help you focus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 49271dbed6f5..17c7934caa77 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li> See colours more accurately</li> <li> Remove colours to help you focus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li>&nbsp;See colours more accurately</li> <li>&nbsp;Remove colours to help you focus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 9a63404229a5..8dfcb401f179 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li> See colours more accurately</li> <li> Remove colours to help you focus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li>&nbsp;See colours more accurately</li> <li>&nbsp;Remove colours to help you focus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 9a63404229a5..8dfcb401f179 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li> See colours more accurately</li> <li> Remove colours to help you focus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Adjust how colours display on your device. This can be helpful when you want to:<br/><br/> <ol> <li>&nbsp;See colours more accurately</li> <li>&nbsp;Remove colours to help you focus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 3476b975253f..2e7e628fa4bc 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Color correction"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Adjust how colors display on your device. This can be helpful when you want to:<br/><br/> <ol> <li> See colors more accurately</li> <li> Remove colors to help you focus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Adjust how colors display on your device. This can be helpful when you want to:<br/><br/> <ol> <li>&nbsp;See colors more accurately</li> <li>&nbsp;Remove colors to help you focus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index fb294c8258fc..d4f21624c8ab 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalía (rojo-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalía (azul-amarillo)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corrección de color"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajusta cómo se muestran los colores en tu dispositivo. Esto puede ser útil cuando quieres:<br/><br/> <ol> <li> Ver colores con más exactitud</li> <li> Quitar colores para mejorar tu concentración</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajusta cómo se muestran los colores en tu dispositivo. Esto puede ser útil cuando quieres:<br/><br/> <ol> <li> Ver colores con más exactitud</li> <li> Quitar colores para tener un enfoque más claro</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Reemplazado por <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 2c5eff2dc730..1a1e84c7fe97 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalía (rojo-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalía (azul-amarillo)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corrección de color"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajusta el modo en que se muestran los colores en tu dispositivo. Esto puede ser útil cuando quieras hacer lo siguiente:<br/><br/> <ol> <li> Ver los colores con más precisión</li> <li> Eliminar colores para ayudarte a mantener la concentración</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajusta el modo en que se muestran los colores en tu dispositivo. Esto puede ser útil cuando quieras hacer lo siguiente:<br/><br/> <ol> <li>&nbsp;Ver los colores con más precisión</li> <li>&nbsp;Quitar colores para ayudarte a mantener la concentración</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Anulado por <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>: <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Tiempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 116faad8431a..34e31388481b 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaalia (punane-roheline)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaalia (sinine-kollane)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Värvide korrigeerimine"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Kohandage seadmes värvide kuvamist. Sellest võib olla kasu, kui soovite:<br/><br/> <ol> <li> värve täpsemalt näha;</li> <li> värve eemaldada, et paremini keskenduda.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Kohandage seadmes värvide kuvamist. Sellest võib olla kasu, kui soovite:<br/><br/> <ol> <li>&nbsp;värve täpsemalt näha;</li> <li>&nbsp;värve eemaldada, et paremini keskenduda.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Alistas <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäänud"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index bfb4efccb499..a18c0f15cbc3 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanopia (gorri-berdeak)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanopia (urdin-horia)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Koloreen zuzenketa"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Doitu nola bistaratzen diren koloreak gailuan. Kasu hauetan izan daiteke lagungarria:<br/><br/> <ol> <li> Koloreak zehatzago ikusi nahi dituzunean.</li> <li> Hobeto fokuratzeko, koloreak kendu nahi dituzunean.</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> hobespena gainjarri zaio"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index f3018ba1e1e8..6b55e89d6c0c 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"قرمزدشواربینی (قرمز-سبز)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"آبیدشواربینی (آبی-زرد)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"تصحیح رنگ"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"نحوه نمایش رنگها را در دستگاهتان تنظیم میکند. این ویژگی میتواند در موارد زیر مفید باشد:<br/><br/> <ol> <li> وقتی میخواهید رنگها را با دقت بیشتری ببینید</li> <li> وقتی میخواهید رنگها را حذف کنید تا تمرکز بیشتری داشته باشید"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"نحوه نمایش رنگها را در دستگاهتان تنظیم میکند. این ویژگی میتواند در موارد زیر مفید باشد:<br/><br/> <ol> <li>&nbsp; وقتی میخواهید رنگها را با دقت بیشتری ببینید</li> <li>&nbsp;وقتی میخواهید رنگها را حذف کنید تا تمرکز بیشتری داشته باشید</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"توسط <xliff:g id="TITLE">%1$s</xliff:g> لغو شد"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 7089937c5a3f..b0519bbdcacd 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (puna-vihersokeus)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (sini-keltasokeus)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Värinkorjaus"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Muuta värien näkymistä laitteellasi. Tästä voi olla hyötyä, kun haluat<br/><br/> <ol> <li> nähdä värit tarkemmin</li> <li> poistaa värejä voidaksesi keskittyä paremmin</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Muuta värien näkymistä laitteellasi. Tästä voi olla hyötyä, kun haluat<br/><br/> <ol> <li>&nbsp;nähdä värit tarkemmin</li> <li>&nbsp;poistaa värejä voidaksesi keskittyä paremmin</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Tämän ohittaa <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index ac8addef49f8..513b7d28169c 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rouge/vert)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (bleu/jaune)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correction des couleurs"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajustez l\'affichage des couleurs sur votre appareil. Ce paramètre peut être utile si vous voulez :<br/><br/> <ol> <li> Mieux distinguer les couleurs</li> <li> Enlever les couleurs pour vous aider à vous concentrer</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajustez l\'affichage des couleurs sur votre appareil. Ce paramètre peut être utile si vous voulez :<br/><br/> <ol> <li>&nbsp;Mieux distinguer les couleurs</li> <li>&nbsp;Enlever les couleurs pour vous aider à vous concentrer</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> : <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index e4e4293d9edb..fc788b669b31 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rouge/vert)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (bleu-jaune)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correction des couleurs"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajustez l\'affichage des couleurs sur votre appareil. Cette option peut vous être utile pour :<br/><br/> <ol> <li> accentuer la précision des couleurs ;</li> <li> supprimer les couleurs pour mieux vous concentrer.</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Temps restant : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 062b7b312430..521251f01d63 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalía (vermello-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalía (azul-amarelo)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corrección da cor"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Axusta a maneira en que se mostran as cores no teu dispositivo. Esta opción pode resultarche útil se queres:<br/><br/> <ol> <li> Ver mellor as cores</li> <li> Quitar as cores para concentrarte mellor</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Axusta a maneira en que se mostran as cores no teu dispositivo. Esta opción pode resultarche útil se queres:<br/><br/> <ol> <li>&nbsp;Ver mellor as cores</li> <li>&nbsp;Quitar as cores para concentrarte mellor</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Anulado por <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 174d0a1db13b..dd0e452c8609 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"પ્રોટેનોમલી (લાલ-લીલો)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ટ્રાઇટેનોમલી(વાદળી-પીળો)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"રંગ સુધારણા"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"તમારા ડિવાઇસ પર રંગો કેવી રીતે બતાવવામાં આવે તેની ગોઠવણી કરો. આ ત્યારે સહાયરૂપ થઈ શકે છે જ્યારે તમારે:<br/><br/> <ol> <li> રંગો વધુ યોગ્ય રીતે જોવા હોય</li> <li> તમને ફોકસ કરવામાં સહાયતા રહે તે માટે રંગો કાઢી નાખવા હોય</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"તમારા ડિવાઇસ પર રંગો કેવી રીતે બતાવવામાં આવે તેની ગોઠવણી કરો. આ ત્યારે સહાયરૂપ થઈ શકે છે જ્યારે તમારે:<br/><br/> <ol> <li>&nbsp;રંગો વધુ યોગ્ય રીતે જોવા હોય</li> <li>&nbsp;તમને ફોકસ કરવામાં સહાયતા રહે તે માટે રંગો કાઢી નાખવા હોય</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> દ્વારા ઓવરરાઇડ થયું"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 835e760df1b3..4e6ccbb929e9 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"लाल रंग पहचान न पाना (लाल-हरा)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"नीला रंग पहचान न पाना (नीला-पीला)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रंग में सुधार करने की सुविधा"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"आपके डिवाइस पर रंगों के दिखने के तरीके में बदलाव करें. इससे, आपको इनमें मदद मिलेगी:<br/><br/> <ol> <li> रंगों को बेहतर तरीके से देखने में</li> <li> आसानी से फ़ोकस करने के लिए, रंग हटाने में</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"आपके डिवाइस पर रंगों के दिखने के तरीके में बदलाव करें. इससे, आपको इन कामों में मदद मिलेगी:<br/><br/> <ol> <li>&nbsp;रंगों को बेहतर तरीके से देखने में</li> <li>&nbsp;आसानी से फ़ोकस के लिए, रंग हटाने में</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> के द्वारा ओवरराइड किया गया"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"बैटरी करीब <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 3d06baada7a8..0f2c6849f874 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (crveno – zeleno)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (plavo – žuto)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekcija boje"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Prilagodite način prikazivanja boja na svojem uređaju. To može biti korisno kad želite:<br/><br/> <ol> <li> vidjeti boje točnije</li> <li> ukloniti boje kako biste se lakše usredotočili</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Prilagodite način prikazivanja boja na svojem uređaju. To može biti korisno kad želite:<br/><br/> <ol> <li>&nbsp;vidjeti boje točnije</li> <li>&nbsp;ukloniti boje kako biste se lakše usredotočili.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Premošćeno postavkom <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 546a038090c4..fd240845ba68 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomália (piros– zöld)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomália (kék–sárga)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Színkorrekció"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Korrigálhatja a színek megjelenítését az eszközén. Ez a következő esetekben lehet hasznos:<br/><br/> <ol> <li> ha pontosabb színeket szeretne látni;</li> <li> ha szeretné eltávolítani a színeket, hogy jobban tudjon koncentrálni.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Korrigálhatja a színek megjelenítését az eszközén. Ez a következő esetekben lehet hasznos:<br/><br/> <ol> <li>&nbsp;ha pontosabb színeket szeretne látni;</li> <li>&nbsp;ha szeretné eltávolítani a színeket, hogy jobban tudjon koncentrálni.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Felülírva erre: <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 7c0963d61ab2..1201b107d31b 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Պրոտանոմալիա (կարմիր-կանաչ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Տրիտանոմալիա (կապույտ-դեղին)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Գունաշտկում"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Կարգավորեք գույների ցուցադրումը ձեր սարքում։ Դա կարող է օգտակար լինել, երբ դուք ուզում եք՝<br/><br/> <ol> <li> Ավելի հստակ տեսնել գույները</li> <li> Հեռացնել գույները՝ կենտրոնանալու համար</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Կարգավորեք գույների ցուցադրումը ձեր սարքում։ Դա կարող է օգտակար լինել, երբ դուք ուզում եք՝<br/><br/> <ol> <li>&nbsp;Ավելի հստակ տեսնել գույները</li> <li>&nbsp;Հեռացնել գույները՝ կենտրոնանալու համար</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Գերազանցված է <xliff:g id="TITLE">%1$s</xliff:g>-ից"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Լիցքը կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 2f8bb46c0af0..3c658adf3ae6 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (merah-hijau)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (biru-kuning)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Koreksi warna"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Sesuaikan cara warna ditampilkan di perangkat Anda. Ini dapat bermanfaat saat Anda ingin:<br/><br/> <ol> <li> Melihat warna dengan lebih akurat</li> <li> Menghapus warna untuk membantu Anda fokus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Sesuaikan cara warna ditampilkan di perangkat Anda. Ini dapat bermanfaat saat Anda ingin:<br/><br/> <ol> <li>&nbsp;Melihat warna dengan lebih akurat</li> <li>&nbsp;Menghapus warna untuk membantu Anda fokus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Digantikan oleh <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index ea2925852d6a..b36adc8126af 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Litblinda (rauðgræn)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Litblinda (blágul)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Litaleiðrétting"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Stilltu litabirtingu í tækinu þínu. Þetta getur gagnast þegar þú vilt:<br/><br/> <ol> <li> Sjá liti skýrar</li> <li> Fjarlægja liti til að fókusa betur</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Stilltu litabirtingu í tækinu þínu. Þetta getur gagnast þegar þú vilt:<br/><br/> <ol> <li>&nbsp;Sjá liti skýrar</li> <li>&nbsp;Fjarlægja liti til að fókusa betur</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Hnekkt af <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 5dd7a520389b..31e9d364185d 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalìa (rosso-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalìa (blu-giallo)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correzione del colore"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Regola la modalità di visualizzazione dei colori sul tuo dispositivo. Può essere utile se vuoi:<br/><br/> <ol> <li> Vedere i colori con più precisione</li> <li> Rimuovere colori per mettere a fuoco più facilmente</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Regola la modalità di visualizzazione dei colori sul tuo dispositivo. Può essere utile se vuoi:<br/><br/> <ol> <li>&nbsp;Vedere i colori con più precisione</li> <li>&nbsp;Rimuovere colori per mettere a fuoco più facilmente</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Valore sostituito da <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo rimanente: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> circa"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 20d1e1bbb71d..90df3b13be9f 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"פרוטנומליה (אדום-ירוק)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"טריטנומליה (כחול-צהוב)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"תיקון צבע"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ניתן לשנות את האופן שבו צבעים מוצגים במכשיר. שינוי כזה עשוי לעזור:<br/><br/> <ol> <li> להבחין בצבעים בצורה יותר מדויקת</li> <li> להסיר צבעים מסוימים כדי להתמקד</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"ניתן לשנות את האופן שבו צבעים מוצגים במכשיר. שינוי כזה עשוי לעזור:<br/><br/> <ol> <li> להבחין בצבעים בצורה יותר מדויקת</li> <li> להסיר צבעים מסוימים כדי להתמקד</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"נעקף על ידי <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"הזמן הנותר: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 4a9126f066af..94219919f248 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"第一色弱(赤緑)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"第三色弱(青黄)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色補正"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"デバイスで色をどのように表示するかを調整できます。この設定は以下の場合に役立ちます。<br/><br/> <ol> <li> 色をより正確に表示したい場合</li> <li> はっきり読み取れるよう色を取り除きたい場合</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"デバイスで色をどのように表示するかを調整できます。この設定は以下の場合に役立ちます。<br/><br/> <ol> <li>&nbsp;色をより正確に表示したい場合</li> <li>&nbsp;はっきり読み取れるよう色を取り除きたい場合</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g>によって上書き済み"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 37db15c87ab8..9371a1a6a698 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"პროტოანომალია (წითელი-მწვანე)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ტრიტანომალია (ლურჯი-ყვითელი)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ფერის კორექცია"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"დააკორექტირეთ, როგორ გამოჩნდება ფერები თქვენს მოწყობილობაზე. ეს შეიძლება დაგეხმაროთ, როდესაც გსურთ:<br/><br/> <ol> <li> ფერების მეტი სიზუსტით დანახვა</li> <li> ფერების მოცილება, რომ უკეთ კონცენტრირდეთ</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"დააკორექტირეთ, როგორ გამოჩნდება ფერები თქვენს მოწყობილობაზე. ეს შეიძლება დაგეხმაროთ, როდესაც გსურთ:<br/><br/> <ol> <li>&nbsp;ფერების მეტი სიზუსტით დანახვა</li> <li>&nbsp;ფერების მოცილება, რომ უკეთ კონცენტრირდეთ</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"უკუგებულია <xliff:g id="TITLE">%1$s</xliff:g>-ის მიერ"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 878966de2cb9..22f60013a83c 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (қызыл-жасыл)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (көк-сары)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Түсті түзету"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Құрылғыңызда түстер қалай көрсетілетінін реттеңіз. Бұл мыналар үшін пайдалы болуы мүмкін:<br/><br/> <ol> <li> түстерді анығырақ көру</li> <li> зейініңізді жақсарту үшін түстерді өшіру</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Құрылғыңызда түстердің қалай көрсетілетінін реттеңіз. Бұл мыналар үшін пайдалы болуы мүмкін:<br/><br/> <ol> <li>&nbsp;түстерді анығырақ көру</li> <li>&nbsp;зейініңізді жақсарту үшін түстерді өшіру</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> үстінен басқан"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 708879a6d9c3..cace86299a26 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (ក្រហមពណ៌បៃតង)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ពណ៌ខៀវ-លឿង)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ការកែពណ៌"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"កែតម្រូវរបៀបដែលពណ៌បង្ហាញនៅលើឧបករណ៍របស់អ្នក។ ចំណុចនេះអាចមានប្រយោជន៍ នៅពេលដែលអ្នកចង់៖<br/><br/> <ol> <li> មើលឃើញពណ៌កាន់តែត្រឹមត្រូវ</li> <li> លុបពណ៌ ដើម្បីជួយអ្នកក្នុងការផ្ដោត</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"កែតម្រូវរបៀបដែលពណ៌បង្ហាញនៅលើឧបករណ៍របស់អ្នក។ ចំណុចនេះអាចមានប្រយោជន៍ នៅពេលដែលអ្នកចង់៖<br/><br/> <ol> <li>&nbsp;មើលឃើញពណ៌កាន់តែត្រឹមត្រូវ</li> <li>&nbsp;លុបពណ៌ ដើម្បីជួយអ្នកក្នុងការផ្ដោតអារម្មណ៍</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"បដិសេធដោយ <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index daf7b6fa6cdf..e2b62a43224a 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ಪ್ರೊಟನೋಮಲಿ (ಕೆಂಪು-ಹಸಿರು)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ಟ್ರಿಟನೋಮಲಿ (ನೀಲಿ-ಹಳದಿ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ಬಣ್ಣದ ತಿದ್ದುಪಡಿ"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಬಣ್ಣಗಳು ಹೇಗೆ ಡಿಸ್ಪ್ಲೇ ಆಗುತ್ತವೆ ಎಂಬುದನ್ನು ಹೊಂದಿಸಿ. ನೀವು ಬಣ್ಣಗಳನ್ನು ಹೆಚ್ಚು ನಿಖರವಾಗಿ ನೋಡಲು ಬಯಸಿದಾಗ:<br/><br/> <ol> <li> ಇದು ಸಹಾಯಕವಾಗಿರುತ್ತದೆ</li> <li> ನಿಮಗೆ ಗಮನಹರಿಸಲು ಸಹಾಯ ಮಾಡಲು ಬಣ್ಣಗಳನ್ನು ತೆಗೆದುಹಾಕಿ</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ಮೂಲಕ ಅತಿಕ್ರಮಿಸುತ್ತದೆ"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index c9960c4086be..7d49dd99bc48 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"적색약(적녹)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"청색약(청황)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"색상 보정"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"기기에 색상이 표시되는 방식을 조정합니다. 색상을 더 정확하게 보고 싶거나 집중을 위해 일부 색상을 제거할 때 유용합니다."</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"기기에 색상이 표시되는 방식을 조정합니다. 다음과 같은 상황에서 유용합니다.<br/><br/> <ol> <li>&nbsp;색상을 더욱 정확하게 보고 싶을 때</li> <li>&nbsp;집중을 위해 색상을 제거하고 싶을 때</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> 우선 적용됨"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>, <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"남은 시간 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 834200d20a4e..1120fe30902d 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (кызыл-жашыл)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (көк-сары)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Түсүн тууралоо"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Түзмөгүңүздө түстөр кантип көрүнөрүн тууралаңыз. Бул төмөнкү учурларда пайдалуу болот:<br/><br/> <ol> <li> Түстөрдү даана көрүү</li> <li> Ынтаа коюу үчүн түстөрдү өчүрүү</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Түзмөгүңүздө түстөр кантип көрүнөрүн тууралаңыз. Бул төмөнкү учурларда пайдалуу болот:<br/><br/> <ol> <li>&nbsp;Түстөрдү даана көрүү</li> <li>&nbsp;Ынтаа коюу үчүн түстөрдү өчүрүү</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> менен алмаштырылган"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 0dcf162720ea..043dd997ed76 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (ສີແດງ-ສີຂຽວ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ສີຟ້າ-ສີເຫຼືອງ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ການປັບແຕ່ງສີ"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ປັບແກ້ການສະແດງສີຢູ່ອຸປະກອນຂອງທ່ານ. ນີ້ອາດມີປະໂຫຍດໃນເວລາທີ່ທ່ານຕ້ອງການ:<br/><br/> <ol> <li> ເບິ່ງເຫັນສີໄດ້ຖືກຕ້ອງຍິ່ງຂຶ້ນ</li> <li> ລຶບສີອອກເພື່ອຊ່ວຍໃຫ້ທ່ານມີສະມາທິ</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"ປັບແກ້ການສະແດງສີຢູ່ອຸປະກອນຂອງທ່ານ. ນີ້ອາດມີປະໂຫຍດໃນເວລາທີ່ທ່ານຕ້ອງການ:<br/><br/> <ol> <li>&nbsp;ເບິ່ງເຫັນສີໄດ້ຖືກຕ້ອງຍິ່ງຂຶ້ນ</li> <li>&nbsp;ລຶບສີອອກເພື່ອຊ່ວຍໃຫ້ທ່ານມີສະມາທິ</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"ຖືກແທນໂດຍ <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index c3f92028c7d7..e31da9e0bedb 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (raudona, žalia)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (mėlyna, geltona)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Spalvų taisymas"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Koreguokite, kaip spalvos rodomos jūsų įrenginyje. Tai gali būti naudinga, kai norite:<br/><br/> <ol> <li> matyti tikslesnes spalvas;</li> <li> pašalinti spalvas, kad būtų lengviau susitelkti.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Koreguokite, kaip spalvos rodomos jūsų įrenginyje. Tai gali būti naudinga, kai norite:<br/><br/> <ol> <li>&nbsp;matyti tikslesnes spalvas;</li> <li>&nbsp;pašalinti spalvas, kad būtų lengviau susitelkti.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Nepaisyta naudojant nuostatą „<xliff:g id="TITLE">%1$s</xliff:g>“"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 5090df0e4bfe..aa747be25e33 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomālija (sarkans/zaļš)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomālija (zils/dzeltens)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Krāsu korekcija"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Pielāgojiet krāsu attēlojumu jūsu ierīcē. Izmantojiet šo funkciju, lai:<br/><br/> <ol> <li> skatītu precīzāku krāsu attēlojumu;</li> <li> noņemtu krāsas, kad jāpievēršas kādam uzdevumam.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Pielāgojiet krāsu attēlojumu savā ierīcē. Izmantojot šo iestatījumu, varat:<br/><br/> <ol> <li>&nbsp;skatīt precīzāku krāsu attēlojumu;</li> <li>&nbsp;noņemt krāsas, lai būtu vieglāk koncentrēties.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Jaunā preference: <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> — <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Aptuvenais atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index c4890d490bc3..fc22362ad9f9 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалија (слепило за црвена и зелена)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалија (слепило за сина и жолта)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекција на бои"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Приспособете го приказот на боите на уредот. Ова е корисно кога сакате:<br/><br/> <ol> <li> да гледате попрецизни бои</li> <li> да отстраните бои за подобра концентрација</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Приспособете го приказот на боите на уредот. Ова е корисно кога сакате:<br/><br/> <ol> <li>&nbsp;да гледате попрецизни бои</li> <li>&nbsp;да отстраните бои за подобра концентрација</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Прескокнато според <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 829d474191e5..15b91dfd8a9b 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"പ്രോട്ടാനോമലി (ചുവപ്പ്-പച്ച)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ട്രിട്ടാനോമലി (നീല-മഞ്ഞ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"നിറം ക്രമീകരിക്കൽ"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"നിങ്ങളുടെ ഉപകരണത്തിൽ നിറങ്ങൾ എങ്ങനെ പ്രദർശിപ്പിക്കണമെന്ന് ക്രമീകരിക്കുക. ഇനിപ്പറയുന്ന കാര്യങ്ങൾ ചെയ്യാൻ ആഗ്രഹിക്കുമ്പോൾ ഇത് സഹായകരമാകും:<br/><br/> <ol> <li> നിറങ്ങൾ കൂടുതൽ കൃത്യമായി കാണാൻ</li> <li> ഫോക്കസ് ചെയ്യാൻ നിങ്ങളെ സഹായിക്കുന്നതിന് നിറങ്ങൾ നീക്കം ചെയ്യാൻ</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"നിങ്ങളുടെ ഉപകരണത്തിൽ നിറങ്ങൾ എങ്ങനെ പ്രദർശിപ്പിക്കണമെന്ന് ക്രമീകരിക്കുക. ഇനിപ്പറയുന്ന കാര്യങ്ങൾ ചെയ്യാൻ ആഗ്രഹിക്കുമ്പോൾ ഇത് സഹായകരമാകും:<br/><br/> <ol> <li>&nbsp;നിറങ്ങൾ കൂടുതൽ കൃത്യമായി കാണാൻ</li> <li>&nbsp;ഫോക്കസ് ചെയ്യാൻ നിങ്ങളെ സഹായിക്കുന്നതിന് നിറങ്ങൾ നീക്കം ചെയ്യാൻ</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ഉപയോഗിച്ച് അസാധുവാക്കി"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 7c833f7a3a52..2d2289e42f0a 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномаль (улаан-ногоон)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомаль (цэнхэр-шар)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Өнгө тохируулах"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Таны төхөөрөмж дээр өнгийг хэрхэн үзүүлэхийг тохируулна уу. Энэ нь таныг дараахыг хийхийг хүссэн үед хэрэгтэй байж болно:<br/><br/> <ol> <li> Өнгийг илүү оновчтой харах</li> <li> Төвлөрөхийн тулд өнгийг хасах</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Таны төхөөрөмж дээр өнгийг хэрхэн үзүүлэхийг тохируулна уу. Энэ нь танд дараахыг хийхийг хүссэн үед хэрэг болж магадгүй:<br/><br/> <ol> <li>Өнгийг илүү оновчтой харах</li> <li>Танд төвлөрөхөд туслахын тулд өнгийг хасах</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Давхарласан <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index e9fe1dd097b9..979a685e8ce6 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"क्षीण रक्तवर्णांधता (लाल-हिरवा)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"रंग दृष्टी कमतरता (निळा-पिवळा)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रंग सुधारणा"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"तुमच्या डिव्हाइसवर रंग कसे प्रदर्शित केले जातात ते अॅडजस्ट करा. तुम्हाला </br><br> </br><br> </br><br>अधिक स्पष्टपणे रंग पाहणे </br><br> </br><br> तुम्हाला फोकस करण्यात मदत करण्यासाठी रंग काढून टाकणे</br><br> </br><br> हे करायचे असते तेव्हा उपयुक्त असू शकते."</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारे अधिलिखित"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 4df385597068..31ba5afa9166 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (merah-hijau)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (biru-kuning)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Pembetulan warna"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Laraskan cara warna dipaparkan pada peranti anda. Ini boleh membantu apabila anda ingin:<br/><br/> <ol> <li> Lihat warna dengan lebih tepat</li> <li> Alih keluar warna untuk membantu anda fokus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Laraskan cara warna dipaparkan pada peranti anda. Ini boleh membantu apabila anda ingin:<br/><br/> <ol> <li>&nbsp;Lihat warna dengan lebih tepat</li> <li>&nbsp;Alih keluar warna untuk membantu anda fokus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Diatasi oleh <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index d80242efce97..a3fa9c75f651 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (အနီ-အစိမ်း)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (အပြာ-အဝါ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"အရောင်ပြင်ဆင်မှု"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"သင့်စက်ပစ္စည်းတွင် အရောင်များပြသပုံကို ချိန်ညှိပါ။ ၎င်းက အောက်ပါတို့တွင် အသုံးဝင်နိုင်သည်-<br/><br/> <ol> <li> အရောင်များကို ပိုမိုတိကျစွာ မြင်လိုခြင်း</li> <li> သင်အာရုံစိုက်နိုင်ရန် အရောင်များကို ဖယ်ရှားခြင်း</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"သင့်စက်ပစ္စည်းတွင် အရောင်များပြသပုံကို ချိန်ညှိပါ။ ၎င်းက အောက်ပါတို့တွင် အသုံးဝင်နိုင်သည်-<br/><br/> <ol> <li>&nbsp;အရောင်များကို ပိုမိုတိကျစွာ မြင်လိုခြင်း</li> <li>&nbsp;သင်အာရုံစိုက်နိုင်ရန် အရောင်များကို ဖယ်ရှားခြင်း</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> မှ ကျော်၍ လုပ်ထားသည်။"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည်"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 7b49b4048e06..42a59cb1c6ad 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (rød-grønn)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (blå-gul)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Fargekorrigering"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Juster hvordan farger vises på enheten. Dette kan være nyttig når du vil<br/><br/> <ol> <li> se farger mer nøyaktig</li> <li> fjerne farger for å gjøre det enklere å fokusere</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Juster hvordan farger vises på enheten. Dette kan være nyttig når du vil<br/><br/> <ol> <li>&nbsp;se farger mer nøyaktig</li> <li>&nbsp;fjerne farger for å gjøre det enklere å fokusere</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overstyres av <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 4d380a5baca0..2b351bcbe9a0 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"प्रोटानेमली (रातो, हरियो)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ट्रिटानोमेली (निलो-पंहेलो)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रङ्ग सुधार"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"तपाईंको यन्त्रमा रङहरू कस्ता देखिन्छन् भन्ने कुरा मिलाउनुहोस्। यो सुविधा निम्न अवस्थामा उपयोगी हुन सक्छ:<br/><br/> <ol> <li> तपाईं अझ सटीक रूपमा रङहरू देख्न चाहनुहुन्छ भने</li> <li> तपाईं कुनै कुरामा ध्यान केन्द्रित गर्न रङहरू हटाउन चाहनुहुन्छ भने</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारा अधिरोहित"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 518aaa9474a8..a3a490deff50 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -236,7 +236,7 @@ <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Maak verbinding met een wifi-netwerk"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, foutopsporing, ontwikkeling"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"Snelle link naar bugrapport"</string> - <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Een knop in het aan/uit-menu weergeven om een bugrapport te maken"</string> + <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Een knop in het aan/uit-menu tonen om een bugrapport te maken"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Stand-by"</string> <string name="keep_screen_on_summary" msgid="1510731514101925829">"Scherm gaat nooit uit tijdens het opladen"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Snoop-logbestand voor Bluetooth-HCI inschakelen"</string> @@ -255,7 +255,7 @@ <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Via wifi ondersteunde MAC-herschikking"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobiele data altijd actief"</string> <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardwareversnelling voor tethering"</string> - <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-apparaten zonder namen weergeven"</string> + <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-apparaten zonder naam tonen"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Absoluut volume uitschakelen"</string> <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche inschakelen"</string> <string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth-AVRCP-versie"</string> @@ -281,8 +281,8 @@ <string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostnaam van privé-DNS-provider"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Geef hostnaam van DNS-provider op"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Kan geen verbinding maken"</string> - <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Opties weergeven voor certificering van draadloze weergave"</string> - <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string> + <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Opties tonen voor certificering van draadloze weergave"</string> + <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Logniveau voor wifi verhogen, tonen per SSID RSSI in wifi-kiezer"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verlaagt het batterijverbruik en verbetert de netwerkprestaties"</string> <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Als deze modus is ingeschakeld, kan het MAC-adres van dit apparaat elke keer wijzigen als het verbinding maakt met een netwerk waarvoor MAC-herschikking is ingeschakeld."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Met datalimiet"</string> @@ -297,7 +297,7 @@ <string name="select_usb_configuration_dialog_title" msgid="3579567144722589237">"USB-configuratie selecteren"</string> <string name="allow_mock_location" msgid="2102650981552527884">"Neplocaties toestaan"</string> <string name="allow_mock_location_summary" msgid="179780881081354579">"Neplocaties toestaan"</string> - <string name="debug_view_attributes" msgid="3539609843984208216">"Inspectie van weergavekenmerk inschakelen"</string> + <string name="debug_view_attributes" msgid="3539609843984208216">"Inspectie van weergavekenmerk aanzetten"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Mobiele data altijd actief houden, ook als wifi actief is (voor sneller schakelen tussen netwerken)."</string> <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Hardwareversnelling voor tethering gebruiken indien beschikbaar"</string> <string name="adb_warning_title" msgid="7708653449506485728">"USB-foutopsporing toestaan?"</string> @@ -334,12 +334,12 @@ <string name="strict_mode_summary" msgid="1838248687233554654">"Knipperend scherm bij lange bewerkingen door apps"</string> <string name="pointer_location" msgid="7516929526199520173">"Cursorlocatie"</string> <string name="pointer_location_summary" msgid="957120116989798464">"Schermoverlay met huidige aanraakgegevens"</string> - <string name="show_touches" msgid="8437666942161289025">"Tikken weergeven"</string> - <string name="show_touches_summary" msgid="3692861665994502193">"Visuele feedback weergeven voor tikken"</string> - <string name="show_screen_updates" msgid="2078782895825535494">"Oppervlakupdates weergeven"</string> + <string name="show_touches" msgid="8437666942161289025">"Tikken tonen"</string> + <string name="show_touches_summary" msgid="3692861665994502193">"Visuele feedback tonen voor tikken"</string> + <string name="show_screen_updates" msgid="2078782895825535494">"Oppervlakupdates tonen"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"Volledige vensteroppervlakken flashen bij updates"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Weergave-updates tonen"</string> - <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Flash-weergave in vensters bij update"</string> + <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Flash-weergaven in vensters bij update"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"Hardwarelayer-upd. tonen"</string> <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Hardwarelagen knipperen groen bij updates"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"Foutopsporing GPU-overbelasting"</string> @@ -349,8 +349,8 @@ <string name="enable_opengl_traces_title" msgid="4638773318659125196">"OpenGL-sporen inschakelen"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"USB-audiorouting uitsch."</string> <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Autom. routing naar USB-randapparatuur uitsch."</string> - <string name="debug_layout" msgid="1659216803043339741">"Indelingsgrenzen weergeven"</string> - <string name="debug_layout_summary" msgid="8825829038287321978">"Clipgrenzen, marges en meer weergeven"</string> + <string name="debug_layout" msgid="1659216803043339741">"Indelingsgrenzen tonen"</string> + <string name="debug_layout_summary" msgid="8825829038287321978">"Clipgrenzen, marges en meer tonen"</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"V.r.n.l.-indelingsrichting afdwingen"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Schermindelingsrichting geforceerd instellen op v.r.n.l. voor alle talen"</string> <string name="force_msaa" msgid="4081288296137775550">"4x MSAA forceren"</string> @@ -404,9 +404,9 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Standaardwaarden voor transcodering overschrijven"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Transcodering inschakelen"</string> <string name="transcode_default" msgid="3784803084573509491">"Aannemen dat apps moderne indelingen ondersteunen"</string> - <string name="transcode_notification" msgid="5560515979793436168">"Transcoderingsmeldingen laten zien"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Transcoderingsmeldingen tonen"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Actieve services"</string> - <string name="runningservices_settings_summary" msgid="1046080643262665743">"Services die momenteel actief zijn, weergeven en beheren"</string> + <string name="runningservices_settings_summary" msgid="1046080643262665743">"Services die momenteel actief zijn, bekijken en beheren"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementatie"</string> <string name="select_webview_provider_dialog_title" msgid="2444261109877277714">"WebView-implementatie instellen"</string> <string name="select_webview_provider_toast_text" msgid="8512254949169359848">"Deze keuze is niet meer geldig. Probeer het opnieuw."</string> @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rood-groen)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (blauw-geel)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Kleurcorrectie"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Aanpassen hoe kleuren worden getoond op je apparaat. In de volgende gevallen kan dit handig zijn:<br/><br/> <ol> <li> Je wilt kleuren duidelijker zien.</li> <li> Je wilt kleuren verwijderen zodat je je beter kunt focussen.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Aanpassen hoe kleuren worden getoond op je apparaat. In de volgende gevallen kan dit handig zijn:<br/><br/> <ol> <li>&nbsp;Je wilt kleuren duidelijker zien.</li> <li>&nbsp;Je wilt kleuren verwijderen zodat je je beter kunt focussen.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overschreven door <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Nog ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index b0fff21d4a07..b7a6819c865b 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ପ୍ରୋଟାନୋମାଲି (ଲାଲ୍-ସବୁଜ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ନୀଳ-ହଳଦିଆ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ରଙ୍ଗ ସଂଶୋଧନ"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ଆପଣଙ୍କ ଡିଭାଇସରେ ରଙ୍ଗଗୁଡ଼ିକ କିପରି ଡିସପ୍ଲେ ହୁଏ ତାହା ଆଡଜଷ୍ଟ କରନ୍ତୁ। ଆପଣ ଏହା କରିବାକୁ ଚାହିଁଲେ ଏହା ଉପଯୋଗୀ ହୋଇପାରେ:<br/><br/> <ol> <li> ଆହୁରି ସଠିକ୍ ଭାବେ ରଙ୍ଗଗୁଡ଼ିକୁ ଦେଖିବା</li> <li> ଆପଣଙ୍କୁ ଫୋକସ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ ରଙ୍ଗଗୁଡ଼ିକୁ କାଢ଼ିବା</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"ଆପଣଙ୍କ ଡିଭାଇସରେ ରଙ୍ଗଗୁଡ଼ିକ କିପରି ଡିସପ୍ଲେ ହୁଏ ତାହା ଆଡଜଷ୍ଟ କରନ୍ତୁ। ଆପଣ ଏହା କରିବାକୁ ଚାହିଁଲେ ଏହା ଉପଯୋଗୀ ହୋଇପାରେ:<br/><br/> <ol> <li>&nbsp;ଆହୁରି ସଠିକ୍ ଭାବେ ରଙ୍ଗଗୁଡ଼ିକୁ ଦେଖିବା</li> <li>&nbsp;ଆପଣଙ୍କୁ ଫୋକସ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ ରଙ୍ଗଗୁଡ଼ିକୁ କାଢ଼ିବା</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ଦ୍ୱାରା ଓଭର୍ରାଇଡ୍ କରାଯାଇଛି"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 71e2dbad01e1..f1d4a8a087e8 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (ਲਾਲ-ਹਰਾ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ਨੀਲਾ-ਪੀਲਾ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ਰੰਗ ਸੁਧਾਈ"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਰੰਗਾਂ ਨੂੰ ਦਿਖਾਉਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ। ਇਹ ਉਦੋਂ ਲਾਹੇਵੰਦ ਹੋ ਸਕਦਾ ਹੈ ਜਦੋਂ ਤੁਸੀਂ ਇਹ ਕਰਨਾ ਚਾਹੋਗੇ:<br/><br/> <ol> <li> ਰੰਗਾਂ ਨੂੰ ਹੋਰ ਸਟੀਕਤਾ ਨਾਲ ਦੇਖਣਾ</li> <li> ਫੋਕਸ ਕਰਨ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਲਈ ਰੰਗਾਂ ਨੂੰ ਹਟਾਉਣਾ</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ਦੁਆਰਾ ਓਵਰਰਾਈਡ ਕੀਤਾ"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index c8d7287c9966..cae9f4e0b4bd 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (czerwony-zielony)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (niebieski-żółty)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekcja kolorów"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Dostosuj sposób wyświetlania kolorów na ekranie urządzenia. Może to być pomocne, gdy chcesz:<br/><br/> <ol> <li> dokładniej widzieć kolory;,</li> <li> usunąć wybrane kolory, aby móc skuteczniej się skupić.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Dostosuj sposób wyświetlania kolorów na ekranie urządzenia. Może to być pomocne, gdy chcesz:<br/><br/> <ol> <li>&nbsp;dokładniej widzieć kolory;</li> <li>&nbsp;usunąć wybrane kolory, aby móc skuteczniej się skupić.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Nadpisana przez <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 1d6624dd5adf..4efdbe21a0b5 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermelho-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (azul-amarelo)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correção de cor"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajuste as cores exibidas no seu dispositivo. Esta opção pode ser útil quando você quer:<br/><br/> <ol> <li> ver cores com mais precisão;</li> <li> remover cores para se concentrar melhor.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajuste as cores exibidas no seu dispositivo. Essa opção pode ser útil quando você quer:<br/><br/> <ol> <li>&nbsp;ver cores com mais precisão;</li> <li>&nbsp;remover cores para se concentrar melhor.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 66d4b23c59d4..5988a120df26 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermelho-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (azul-amarelo)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correção da cor"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajuste a visualização das cores no dispositivo. Isto pode ser útil quando pretender:<br/><br/> <ol> <li> Ver cores com maior precisão</li> <li> Remover cores para melhorar a sua concentração</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajuste a visualização das cores no dispositivo. Isto pode ser útil quando pretender:<br/><br/> <ol> <li>&nbsp;Ver cores com maior precisão</li> <li>&nbsp;Remover cores para melhorar a sua concentração</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 1d6624dd5adf..4efdbe21a0b5 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermelho-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (azul-amarelo)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correção de cor"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajuste as cores exibidas no seu dispositivo. Esta opção pode ser útil quando você quer:<br/><br/> <ol> <li> ver cores com mais precisão;</li> <li> remover cores para se concentrar melhor.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajuste as cores exibidas no seu dispositivo. Essa opção pode ser útil quando você quer:<br/><br/> <ol> <li>&nbsp;ver cores com mais precisão;</li> <li>&nbsp;remover cores para se concentrar melhor.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 3e77ab6825a6..7d2ef6a293e8 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (roșu-verde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (albastru-galben)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corecția culorii"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ajustați modul în care se afișează culorile pe dispozitiv. Acest lucru poate fi util când doriți să:<br/><br/> <ol> <li> vedeți culorile mai bine</li> <li> eliminați culorile pentru a vă ajuta să vă concentrați</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ajustați modul în care se afișează culorile pe dispozitiv. Acest lucru poate fi util când doriți să:<br/><br/> <ol> <li>&nbsp;vedeți culorile mai bine;</li> <li>&nbsp; eliminați culorile pentru a vă ajuta să vă concentrați.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Valoare înlocuită de <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Timp aproximativ rămas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index b342287612b5..02ed8eb7c002 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (красный/зеленый)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (синий/желтый)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Коррекция цвета"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Настройте цветопередачу на экране устройства. Эта функция может помочь:<br/><br/> <ol> <li> сделать цвета более четкими;</li> <li> убрать цвета, чтобы вам проще было сфокусироваться.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Настройте цветопередачу на экране устройства. Эта функция может помочь:<br/><br/> <ol> <li>&nbsp;сделать цвета более четкими;</li> <li>&nbsp;убрать цвета, чтобы вам проще было сфокусироваться.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Новая настройка: <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"Уровень заряда – <xliff:g id="PERCENTAGE">%1$s</xliff:g>. <xliff:g id="TIME_STRING">%2$s</xliff:g>."</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Заряда хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 035a159d6e97..b5d77c0bcbf7 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"වර්ණ දුර්වලතාවය (රතු-කොළ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"වර්ණ අන්ධතාවය (නිල්-කහ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"වර්ණ නිවැරදි කිරීම"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ඔබගේ උපාංගයේ වර්ණ සංදර්ශනය වන ආකාරය සීරුමාරු කරන්න. මෙය ඔබට පහත දේවල් සිදු කිරීමට අවශ්ය විට ප්රයෝජනවත් විය හැකිය:<br/><br/> <ol> <li> වර්ණ වඩාත් නිවැරදිව බැලීම</li> <li> ඔබට අවධානය යොමු කිරීමට උදව් වීමට වර්ණ ඉවත් කිරීම</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"ඔබගේ උපාංගයේ වර්ණ සංදර්ශනය වන ආකාරය සීරුමාරු කරන්න. මෙය ඔබට පහත දේවල් සිදු කිරීමට අවශ්ය විට ප්රයෝජනවත් විය හැකිය:<br/><br/> <ol> <li>&nbsp;වර්ණ වඩාත් නිවැරදිව බැලීම</li> <li>&nbsp;ඔබට අවධානය යොමු කිරීමට උදව් වීමට වර්ණ ඉවත් කිරීම</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> මගින් ඉක්මවන ලදී"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ක් පමණ ඉතිරියි"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index b24ac8e1587e..4d4262346684 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomália (červená a zelená)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomália (modrá a žltá)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Úprava farieb"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Upravte si zobrazovanie farieb v zariadení. Môže to byť užitočné, ak chcete:<br/><br/> <ol> <li> zobraziť presnejšie viac farieb;y</li> <li> odstrániť farby, aby ste sa mohli lepšie sústrediť.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Upravte si zobrazovanie farieb v zariadení. Môže to byť užitočné, ak chcete:<br/><br/> <ol> <li>&nbsp;presnejšie zobrazovať farby;</li> <li>&nbsp;odstrániť farby, aby ste sa mohli sústrediť.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Prekonané predvoľbou <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 626402ae7a10..b8fb2c4947b7 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (rdeča – zelena)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (modra – rumena)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Popravljanje barv"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Prilagodite prikaz barv v napravi. To je uporabno, ko želite:<br/><br/> <ol> <li> videti bolj prave barve;</li> <li> odstraniti barve, da se lažje osredotočite.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Prilagodite prikaz barv v napravi. To je uporabno, ko želite:<br/><br/> <ol> <li>&nbsp;videti bolj prave barve;</li> <li>&nbsp;odstraniti barve, da se lažje osredotočite.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Preglasila nastavitev: <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 4f22348067c4..95ba023e1ca0 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (e kuqe - e gjelbër)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (e kaltër - e verdhë)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korrigjimi i ngjyrës"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Rregullo mënyrën se si ngjyrat afishohen në pajisjen tënde. Kjo mund të jetë e dobishme kur dëshiron që:<br/><br/> <ol> <li> T\'i shikosh ngjyrat me më shumë saktësi</li> <li> T\'i heqësh ngjyrat për të të ndihmuar të fokusohesh</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Mbivendosur nga <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 4f37180c7f7e..ab49d948c1a9 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалија (црвено-зелено)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалија (плаво-жуто)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекција боја"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Прилагодите начин на који се боје приказују на уређају. То може да буде корисно када желите:<br/><br/> <ol> <li> да вам се боје тачније приказују</li> <li> да уклоните боје како бисте се фокусирали</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Прилагодите начин на који се боје приказују на уређају. То може да буде корисно када желите:<br/><br/> <ol> <li>&nbsp;да вам се боје тачније приказују</li> <li>&nbsp;да уклоните боје како бисте се фокусирали</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Замењује га <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>–<xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 069b6a577055..a63070688f03 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (rött-grönt)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (blått-gult)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Färgkorrigering"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Ändra hur färger visas på enheten. Det kan vara ett bra hjälpmedel när du vill<br/><br/> <ol> <li> att färger ska visas mer exakt</li> <li> ta bort färger för att fokusera bättre</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Ändra hur färger visas på enheten. Det kan vara ett bra hjälpmedel när du vill<br/><br/> <ol> <li>&nbsp;att färger ska visas mer exakt</li> <li>&nbsp;ta bort färger för att fokusera bättre.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Har åsidosatts av <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 0fb620cefce3..ef6843471fc2 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (nyekundu-kijani)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (samawati-manjano)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Usahihishaji wa rangi"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Badilisha jinsi rangi zinavyoonekana kwenye kifaa chako. Hali hii inaweza kuwa muhimu unapotaka:<br/><br/> <ol> <li> Kuona rangi kwa usahihi zaidi</li> <li> Kuondoa rangi ili kukusaidia kuwa makini</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Badilisha jinsi rangi zinavyoonekana kwenye kifaa chako. Hali hii inaweza kuwa muhimu unapotaka:<br/><br/> <ol> <li>&nbsp;Kuona rangi kwa usahihi zaidi</li> <li>&nbsp;Kuondoa rangi ili kukusaidia kuwa makini</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Imetanguliwa na <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 3106a69a8e7f..931b43fb5bf1 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"நிறம் அடையாளங்காண முடியாமை (சிவப்பு-பச்சை)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"நிறம் அடையாளங்காண முடியாமை (நீலம்-மஞ்சள்)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"வண்ணத்திருத்தம்"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"சாதனத்தில் வண்ணங்கள் காண்பிக்கப்படும் விதத்தைச் சரிசெய்யலாம். இதன் மூலம் நீங்கள் விரும்பும்போதெல்லாம்:<br/><br/> <ol> <li> வண்ணங்களை மிகத் தெளிவாகப் பார்க்கலாம்</li> <li> கவனம் சிதறாமல் இருக்க வண்ணங்களை நீக்கலாம்</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"சாதனத்தில் வண்ணங்கள் காண்பிக்கப்படும் விதத்தைச் சரிசெய்யலாம். இதன் மூலம் நீங்கள் விரும்பும்போதெல்லாம்:<br/><br/> <ol> <li>&nbsp;வண்ணங்களை மிகத் தெளிவாகப் பார்க்கலாம்</li> <li>கவனம் சிதறாமல் இருக்க வண்ணங்களை நீக்கலாம்</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> மூலம் மேலெழுதப்பட்டது"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 1f78c0c240e4..987ff78a42df 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -424,7 +424,8 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ప్రొటానోమలీ (ఎరుపు-ఆకుపచ్చ రంగు)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ట్రైటనోమలీ (నీలం-పసుపు రంగు)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"కలర్ సరిచేయడం"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"మీ పరికరంపై రంగులు కనిపించే విధానాన్ని అడ్జస్ట్ చేయండి. మీకు కావలసినప్పుడు, ఇది సహాయకరంగా ఉంటుంది:<br/><br/> <ol> <li> మరింత ఖచ్చితంగా రంగులను చూడండి</li> <li> మీరు ఫోకస్ చేయడంలో సహాయపడటానికి రంగులను తీసివేయండి</li> </ol>"</string> + <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (2333641630205214702) --> + <skip /> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ద్వారా భర్తీ చేయబడింది"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 4bd7b6ddd21e..53a9605065b4 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ตาบอดจางสีแดง (สีแดง/เขียว)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ตาบอดจางสีน้ำเงิน (สีน้ำเงิน/เหลือง)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"การแก้สี"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"ปรับวิธีแสดงสีในอุปกรณ์ การดำเนินการนี้จะเป็นประโยชน์เมื่อคุณต้องการดังนี้<br/><br/> <ol> <li> เห็นสีได้ถูกต้องยิ่งขึ้น</li> <li> นำสีออกเพื่อช่วยให้เห็นชัดเจนยิ่งขึ้น</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"ปรับวิธีแสดงสีในอุปกรณ์ การดำเนินการนี้จะเป็นประโยชน์เมื่อคุณต้องการดังนี้<br/><br/> <ol> <li>&nbsp;เห็นสีได้ถูกต้องยิ่งขึ้น</li> <li>&nbsp;นำสีออกเพื่อช่วยให้เห็นชัดเจนยิ่งขึ้น</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"แทนที่โดย <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index e56e5b9b6077..f36d691c4a22 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (pula-berde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (asul-dilaw)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Pagtatama ng kulay"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Isaayos kung paano ipinapakita ang mga kulay sa iyong device. Makakatulong ito kapag gusto mong:<br/><br/> <ol> <li> Makakita ng mas tumpak na mga kulay</li> <li> Mag-alis ng mga kulay para matulungan kang mag-focus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Isaayos kung paano ipinapakita ang mga kulay sa iyong device. Makakatulong ito kapag gusto mong:<br/><br/> <ol> <li>&nbsp;Makakita ng mas tumpak na mga kulay</li> <li>&nbsp;Mag-alis ng mga kulay para matulungan kang mag-focus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Na-override ng <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index ef516c4ccef8..0c4e7f0f28b1 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (kırmızı-yeşil)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (mavi-sarı)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Renk düzeltme"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Renklerin cihazınızda nasıl görüntüleneceğini düzenleyin Bu, şunları yapmak istediğinizde kullanışlı olur:<br/><br/> <ol> <li> Renkleri daha doğru görmek</li> <li> Odaklanmanıza yardımcı olması için renkleri kaldırmak</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Renklerin cihazınızda nasıl görüntüleneceğini düzenleyin Bu, şunları yapmak istediğinizde kullanışlı olur:<br/><br/> <ol> <li>&nbsp;Renkleri daha doğru görmek</li> <li>&nbsp;Odaklanmanıza yardımcı olması için renkleri kaldırmak</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> tarafından geçersiz kılındı"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 81528ad32a22..70978351cc8d 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалія (червоний – зелений)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалія (синій – жовтий)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекція кольору"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Налаштуйте відтворення кольорів на екрані пристрою. Це може бути корисно, якщо ви хочете:<br/><br/> <ol> <li> точніше відтворювати кольори;</li> <li> вилучити кольори, щоб зосередитися на головному.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Налаштуйте відтворення кольорів на екрані пристрою. Це може бути корисно, якщо ви хочете:<br/><br/> <ol> <li>&nbsp;точніше відтворювати кольори;</li> <li>&nbsp;вилучити кольори, щоб зосередитися на головному.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Замінено на <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 798c885c4a7e..0b03d99c90f6 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (سرخ سبز)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (نیلا پیلا)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"رنگ کی اصلاح"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"آپ کے آلے پر رنگوں کے ڈسپلے ہونے کے طریقے کو ایڈجسٹ کریں۔ یہ خصوصیت درج ذیل کے لیے مددگار ثابت ہو سکتی ہے:<br/><br/> <ol> <li> جب آپ رنگوں کو مزید درست طریقے سے دیکھنا چاہیں </li> <li> فوکس کرنے میں مدد کے لیے رنگوں کو ہٹادیں</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"آپ کے آلے پر رنگوں کے ڈسپلے ہونے کے طریقے کو ایڈجسٹ کریں۔ یہ درج ذیل کے لیے مددگار ثابت ہوسکتا ہے :<br/>&ltlt;br/> <ol><li>جب آپ رنگوں کو مزید درست طریقے سے دیکھنا چاہیں </li> <li>&nbsp;فوکس کرنے میں مدد کرنے کے لئے رنگوں کو ہٹائیں </li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> کے ذریعہ منسوخ کردیا گیا"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 6efc0bec50f5..4144aac2e3b0 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaliya (qizil/yashil)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaliya (ko‘k/sariq)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Rangni tuzatish"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Qurilmadagi ranglar qanday chiqishini moslash Bu quyidagi amallarni bajarishga yordam beradi:<br/><br/> <ol> <li> Ranglarni yanada aniq koʻrish</li> <li> Diqqatni jamlash uchun ranglarni olib tashlash</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Qurilmadagi ranglar qanday chiqishini moslash Bu quyidagi amallarni bajarishga yordam beradi:<br/><br/> <ol> <li>&nbsp;Ranglarni yanada aniq koʻrish</li> <li>&nbsp;Diqqatni jamlash uchun ranglarni olib tashlash</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> bilan almashtirildi"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 148ed89dc6dd..1afa1fe3ff40 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Mù màu đỏ không hoàn toàn (đỏ-xanh lục)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Mù màu (xanh lam-vàng)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Chỉnh màu"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Điều chỉnh cách các màu hiển thị trên thiết bị. Tùy chọn này có thể hữu ích khi bạn muốn:<br/><br/> <ol> <li> Xem các màu chính xác hơn</li> <li> Loại bỏ các màu để giúp bạn tập trung</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Điều chỉnh cách các màu hiển thị trên thiết bị. Tùy chọn này có thể hữu ích khi bạn muốn:<br/><br/> <ol> <li>&nbsp;Xem các màu chính xác hơn</li> <li>&nbsp;Loại bỏ các màu để giúp bạn tập trung</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Bị ghi đè bởi <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 67923c5ce407..a71d5438bee8 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"红色弱视(红绿不分)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"蓝色弱视(蓝黄不分)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色彩校正"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"调整设备上的颜色显示方式。此设置适用于以下情况:<br/><br/> <ol> <li>想要更准确地查看颜色</li> <li>想要去除颜色,以便集中注意力</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"调整设备上的颜色显示方式。此设置对以下情况有帮助:<br/><br/> <ol> <li>&nbsp;您想更准确地看颜色</li> <li>&nbsp;您想去除一些颜色,以便集中注意力</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"已被“<xliff:g id="TITLE">%1$s</xliff:g>”覆盖"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index bf69b3157e71..b628c35b833f 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"紅色弱視 (紅綠)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"藍色弱視 (藍黃)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色彩校正"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"調整裝置顯示顏色嘅方式。呢項設定喺以下情況適用:<br/><br/> <ol> <li> 想令裝置更加準確咁顯示顏色</li> <li> 移除顏色嚟提高專注力</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"調整裝置顯示顏色嘅方式。呢項設定喺以下情況適用:<br/><br/> <ol> <li>&nbsp;想令裝置更加準確咁顯示顏色</li> <li>&nbsp;移除顏色嚟提高專注力</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"已由「<xliff:g id="TITLE">%1$s</xliff:g>」覆寫"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index dcfc59934dd8..16f405ba1726 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"紅色弱視 (紅-綠)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"藍色弱視 (藍-黃)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色彩校正"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"調整裝置顯示顏色的方式。這項設定適用於以下情況:<br/><br/> <ol> <li> 想讓裝置更準確地顯示顏色</li> <li> 移除顏色以提高專注力</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"調整裝置顯示顏色的方式。這項設定適用於以下情況:<br/><br/> <ol> <li>&nbsp;想讓裝置更準確地顯示顏色</li> <li>&nbsp;移除顏色以提高專注力</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"已改為<xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 7b0274a249bc..324ebf6a9acd 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -424,7 +424,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"I-Protanomaly (bomvu-luhlaza)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"I-Tritanomaly (luhlaza okwesibhakabhaka-phuzi)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Ukulungiswa kombala"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="8625527799885140826">"Lungisa indlela imibala eboniswa ngayo kudivayisi yakkho. Lokhu kungaba usizo lapho ufuna:<br/><br/> <ol> <li> Ukubona imibala ngokunembilie</li> <li> Ukususa imibala ukuze ugxile</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="2333641630205214702">"Lungisa indlela imibala eboniswa ngayo kudivayisi yakkho. Lokhu kungasiza uma ufuna ukwenza lokhu:<br/><br/> <ol> <li>&nbsp;Ukubona imibala ngokunembe kakhulu</li> <li>&nbsp;Ukususa imibala ukukusiza ukuthi ugxile</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Igitshezwe ngaphezulu yi-<xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele"</string> diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 8d8e442e094b..b86ae6d199d7 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -435,6 +435,9 @@ <uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION"/> + <!-- Permission required for CTS test - ResourceObserverNativeTest --> + <uses-permission android:name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" /> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 685896523e36..691d111089b8 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -958,8 +958,6 @@ <string name="quick_settings_dark_mode_secondary_label_on_at">On at <xliff:g id="time" example="10 pm">%s</xliff:g></string> <!-- QuickSettings: Secondary text for when the Dark theme or some other tile will be on until some user-selected time. [CHAR LIMIT=20] --> <string name="quick_settings_dark_mode_secondary_label_until">Until <xliff:g id="time" example="7 am">%s</xliff:g></string> - <!-- QuickSettings: Label for the toggle that controls whether Reduce Brightness is enabled. [CHAR LIMIT=NONE] --> - <string name="quick_settings_reduce_bright_colors_label">Reduce brightness</string> <!-- QuickSettings: NFC tile [CHAR LIMIT=NONE] --> <string name="quick_settings_nfc_label">NFC</string> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java index 255fffdb3291..fa2f32fee755 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java @@ -99,11 +99,6 @@ public class TransactionCompat { return this; } - @Deprecated - public TransactionCompat setEarlyWakeup() { - return this; - } - public TransactionCompat setColor(SurfaceControlCompat surfaceControl, float[] color) { mTransaction.setColor(surfaceControl.mSurfaceControl, color); return this; @@ -118,8 +113,4 @@ public class TransactionCompat { SurfaceControl relativeTo, int z) { t.setRelativeLayer(surfaceControl, relativeTo, z); } - - @Deprecated - public static void setEarlyWakeup(Transaction t) { - } } diff --git a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java index 945c9c499401..118f98da11e2 100644 --- a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java +++ b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java @@ -154,7 +154,9 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i @Override public void onBiometricRunningStateChanged(boolean running, BiometricSourceType biometricSourceType) { - mRunningFPS = running && biometricSourceType == FINGERPRINT; + if (biometricSourceType == FINGERPRINT) { + mRunningFPS = running; + } mAuthenticated &= !mRunningFPS; updateButtonVisibility(); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java index c051b695e823..ca2c034c5d32 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java @@ -49,7 +49,6 @@ import android.view.accessibility.AccessibilityManager; import com.android.internal.R; import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity; import com.android.internal.util.ScreenshotHelper; -import com.android.systemui.Dependency; import com.android.systemui.SystemUI; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.recents.Recents; @@ -140,6 +139,7 @@ public class SystemActions extends SystemUI { private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF"; private final SystemActionsBroadcastReceiver mReceiver; + private final Recents mRecents; private Locale mLocale; private final AccessibilityManager mA11yManager; private final Lazy<StatusBar> mStatusBar; @@ -150,8 +150,10 @@ public class SystemActions extends SystemUI { @Inject public SystemActions(Context context, NotificationShadeWindowController notificationShadeController, - Lazy<StatusBar> statusBar) { + Lazy<StatusBar> statusBar, + Recents recents) { super(context); + mRecents = recents; mReceiver = new SystemActionsBroadcastReceiver(); mLocale = mContext.getResources().getConfiguration().getLocales().get(0); mA11yManager = (AccessibilityManager) mContext.getSystemService( @@ -366,15 +368,15 @@ public class SystemActions extends SystemUI { } private void handleRecents() { - Dependency.get(Recents.class).toggleRecentApps(); + mRecents.toggleRecentApps(); } private void handleNotifications() { - Dependency.get(StatusBar.class).animateExpandNotificationsPanel(); + mStatusBar.get().animateExpandNotificationsPanel(); } private void handleQuickSettings() { - Dependency.get(StatusBar.class).animateExpandSettingsPanel(null); + mStatusBar.get().animateExpandSettingsPanel(null); } private void handlePowerDialog() { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index b9f9b1bc85dd..98b3fe46ff57 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -321,6 +321,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { mSensorProps = findFirstUdfps(); // At least one UDFPS sensor exists checkArgument(mSensorProps != null); + mStatusBar.setSensorRect(getSensorLocation()); mCoreLayoutParams = new WindowManager.LayoutParams( // TODO(b/152419866): Use the UDFPS window type when it becomes available. @@ -367,7 +368,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback { */ public RectF getSensorLocation() { // This is currently used to calculate the amount of space available for notifications - // on lockscreen. Keyguard is only shown in portrait mode for now, so this will need to + // on lockscreen and for the udfps light reveal animation on keyguard. + // Keyguard is only shown in portrait mode for now, so this will need to // be updated if that ever changes. return new RectF(mSensorProps.sensorLocationX - mSensorProps.sensorRadius, mSensorProps.sensorLocationY - mSensorProps.sensorRadius, diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java index 2c684d688483..f9c2a2aed751 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java @@ -19,12 +19,13 @@ package com.android.systemui.people; import static android.app.Notification.CATEGORY_MISSED_CALL; import static android.app.Notification.EXTRA_MESSAGES; import static android.app.people.ConversationStatus.ACTIVITY_ANNIVERSARY; +import static android.app.people.ConversationStatus.ACTIVITY_AUDIO; import static android.app.people.ConversationStatus.ACTIVITY_BIRTHDAY; import static android.app.people.ConversationStatus.ACTIVITY_GAME; import static android.app.people.ConversationStatus.ACTIVITY_LOCATION; -import static android.app.people.ConversationStatus.ACTIVITY_MEDIA; import static android.app.people.ConversationStatus.ACTIVITY_NEW_STORY; import static android.app.people.ConversationStatus.ACTIVITY_UPCOMING_BIRTHDAY; +import static android.app.people.ConversationStatus.ACTIVITY_VIDEO; import static android.app.people.ConversationStatus.AVAILABILITY_AVAILABLE; import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT; import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH; @@ -496,8 +497,10 @@ public class PeopleSpaceUtils { return context.getString(R.string.location_status); case ACTIVITY_NEW_STORY: return context.getString(R.string.new_story_status); - case ACTIVITY_MEDIA: + case ACTIVITY_VIDEO: return context.getString(R.string.video_status); + case ACTIVITY_AUDIO: + return context.getString(R.string.audio_status); case ACTIVITY_GAME: return context.getString(R.string.game_status); default: diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java index 479be659ba10..03a6689bc449 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java @@ -25,8 +25,8 @@ import android.provider.Settings; import android.service.quicksettings.Tile; import android.widget.Switch; +import com.android.internal.R; import com.android.internal.logging.MetricsLogger; -import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -98,14 +98,14 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> @Override public CharSequence getTileLabel() { - return mContext.getString(R.string.quick_settings_reduce_bright_colors_label); + return mContext.getString(R.string.reduce_bright_colors_feature_name); } @Override protected void handleUpdateState(BooleanState state, Object arg) { state.value = mReduceBrightColorsController.isReduceBrightColorsActivated(); state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; - state.label = mContext.getString(R.string.quick_settings_reduce_bright_colors_label); + state.label = mContext.getString(R.string.reduce_bright_colors_feature_name); state.expandedAccessibilityClassName = Switch.class.getName(); state.contentDescription = state.label; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt index c1feacaba440..563470d1a260 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt @@ -82,6 +82,31 @@ object LiftReveal : LightRevealEffect { } } +class CircleReveal( + /** X-value of the circle center of the reveal. */ + val centerX: Float, + /** Y-value of the circle center of the reveal. */ + val centerY: Float, + /** Radius of initial state of circle reveal */ + val startRadius: Float, + /** Radius of end state of circle reveal */ + val endRadius: Float +) : LightRevealEffect { + override fun setRevealAmountOnScrim(amount: Float, scrim: LightRevealScrim) { + val interpolatedAmount = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(amount) + val fadeAmount = + LightRevealEffect.getPercentPastThreshold(interpolatedAmount, 0.75f) + val radius = startRadius + ((endRadius - startRadius) * interpolatedAmount) + scrim.revealGradientEndColorAlpha = 1f - fadeAmount + scrim.setRevealGradientBounds( + centerX - radius /* left */, + centerY - radius /* top */, + centerX + radius /* right */, + centerY + radius /* bottom */ + ) + } +} + class PowerButtonReveal( /** Approximate Y-value of the center of the power button on the physical device. */ val powerButtonY: Float diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index e1199077efb9..3daa2b3e1e64 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -132,6 +132,7 @@ public class NotificationShelf extends ActivatableNotificationView implements mHiddenShelfIconSize = res.getDimensionPixelOffset(R.dimen.hidden_shelf_icon_size); mGapHeight = res.getDimensionPixelSize(R.dimen.qs_notification_padding); + mShelfIcons.setInNotificationIconShelf(true); if (!mShowNotificationShelf) { setVisibility(GONE); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 6b144c652c56..25de551d2699 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -152,6 +152,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { private boolean mDozing; private boolean mOnLockScreen; private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL; + private boolean mInNotificationIconShelf; private boolean mChangingViewPositions; private int mAddAnimationStartIndex = -1; private int mCannedAnimationStartIndex = -1; @@ -702,6 +703,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { mLockScreenMode = lockScreenMode; } + public void setInNotificationIconShelf(boolean inShelf) { + mInNotificationIconShelf = inShelf; + } + public class IconState extends ViewState { public static final int NO_VALUE = NotificationIconContainer.NO_VALUE; public float iconAppearAmount = 1.0f; @@ -813,7 +818,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } icon.setVisibleState(visibleState, animationsAllowed); - icon.setIconColor(mThemedTextColorPrimary, + icon.setIconColor(mInNotificationIconShelf ? mThemedTextColorPrimary : iconColor, needsCannedAnimation && animationsAllowed); if (animate) { animateTo(icon, animationProperties); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 427df5ebbbab..0e1fe22b2454 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -22,6 +22,7 @@ import static android.app.StatusBarManager.WindowType; import static android.app.StatusBarManager.WindowVisibleState; import static android.app.StatusBarManager.windowStateToString; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY; +import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; @@ -46,6 +47,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING; import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import static com.android.wm.shell.bubbles.BubbleController.TASKBAR_CHANGED_BROADCAST; +import android.animation.ValueAnimator; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -74,6 +76,7 @@ import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.PointF; +import android.graphics.RectF; import android.media.AudioAttributes; import android.metrics.LogMaker; import android.net.Uri; @@ -179,6 +182,7 @@ import com.android.systemui.settings.brightness.BrightnessSlider; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.BackDropView; +import com.android.systemui.statusbar.CircleReveal; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.FeatureFlags; @@ -382,6 +386,8 @@ public class StatusBar extends SystemUI implements DemoMode, private ChargingRippleView mChargingRipple; private WiredChargingRippleController mChargingRippleAnimationController; private PowerButtonReveal mPowerButtonReveal; + private CircleReveal mCircleReveal; + private ValueAnimator mCircleRevealAnimator = ValueAnimator.ofFloat(0f, 1f); private final Object mQueueLock = new Object(); @@ -1206,7 +1212,9 @@ public class StatusBar extends SystemUI implements DemoMode, mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim); mChargingRippleAnimationController.setViewHost(mNotificationShadeWindowView); - if (mFeatureFlags.useNewLockscreenAnimations() && mDozeParameters.getAlwaysOn()) { + + if (mFeatureFlags.useNewLockscreenAnimations() + && (mDozeParameters.getAlwaysOn() || mDozeParameters.isQuickPickupEnabled())) { mLightRevealScrim.setVisibility(View.VISIBLE); mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE); } else { @@ -3353,6 +3361,9 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanelViewController.fadeOut(0, FADE_KEYGUARD_DURATION_PULSING, ()-> { hideKeyguard(); + if (shouldShowCircleReveal()) { + startCircleReveal(); + } mStatusBarKeyguardViewManager.onKeyguardFadedAway(); }).start(); } @@ -3666,15 +3677,16 @@ public class StatusBar extends SystemUI implements DemoMode, updateQsExpansionEnabled(); mKeyguardViewMediator.setDozing(mDozing); - final boolean usePowerButtonEffect = - (isDozing && mWakefulnessLifecycle.getLastSleepReason() - == PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON) - || (!isDozing && mWakefulnessLifecycle.getLastWakeReason() - == PowerManager.WAKE_REASON_POWER_BUTTON); - - mLightRevealScrim.setRevealEffect(usePowerButtonEffect - ? mPowerButtonReveal - : LiftReveal.INSTANCE); + if (!isDozing && shouldShowCircleReveal()) { + startCircleReveal(); + } else if ((isDozing && mWakefulnessLifecycle.getLastSleepReason() + == PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON) + || (!isDozing && mWakefulnessLifecycle.getLastWakeReason() + == PowerManager.WAKE_REASON_POWER_BUTTON)) { + mLightRevealScrim.setRevealEffect(mPowerButtonReveal); + } else if (!mCircleRevealAnimator.isRunning()) { + mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE); + } mNotificationsController.requestNotificationUpdate("onDozingChanged"); updateDozingState(); @@ -3684,6 +3696,22 @@ public class StatusBar extends SystemUI implements DemoMode, Trace.endSection(); } + private void startCircleReveal() { + mLightRevealScrim.setRevealEffect(mCircleReveal); + mCircleRevealAnimator.cancel(); + mCircleRevealAnimator.addUpdateListener(animation -> + mLightRevealScrim.setRevealAmount( + (float) mCircleRevealAnimator.getAnimatedValue())); + mCircleRevealAnimator.setDuration(900); + mCircleRevealAnimator.start(); + } + + private boolean shouldShowCircleReveal() { + return mCircleReveal != null && !mCircleRevealAnimator.isRunning() + && mKeyguardUpdateMonitor.isUdfpsEnrolled() + && mBiometricUnlockController.getBiometricType() == FINGERPRINT; + } + private void updateKeyguardState() { mKeyguardStateController.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(), mStatusBarKeyguardViewManager.isOccluded()); @@ -4170,6 +4198,15 @@ public class StatusBar extends SystemUI implements DemoMode, mBiometricUnlockController.getBiometricType()); } + /** + * Set the location of the sensor on UDFPS if existent. + */ + public void setSensorRect(RectF rect) { + final float startRadius = (rect.right - rect.left) / 2f; + mCircleReveal = new CircleReveal(rect.centerX(), rect.centerY(), + startRadius, rect.centerY() - startRadius); + } + @VisibleForTesting public void updateScrimController() { Trace.beginSection("StatusBar#updateScrimController"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 862037617374..8fe9a481ccf6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -66,7 +66,11 @@ public interface StatusBarIconController { /** * Display the no calling & SMS icons. */ - void setCallIndicatorIcons(String slot, List<CallIndicatorIconState> states); + void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states); + /** + * Display the no calling & SMS icons. + */ + void setNoCallingIcons(String slot, List<CallIndicatorIconState> states); public void setIconVisibility(String slot, boolean b); /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java index f0c8527bcb7f..6404aea05a4d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java @@ -219,27 +219,56 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu } /** - * Accept a list of CallIndicatorIconStates, and show them in the same slot - * @param slot StatusBar slot + * Accept a list of CallIndicatorIconStates, and show the call strength icons. + * @param slot StatusBar slot for the call strength icons * @param states All of the no Calling & SMS icon states */ @Override - public void setCallIndicatorIcons(String slot, List<CallIndicatorIconState> states) { + public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) { + Slot callStrengthSlot = getSlot(slot); + int callStrengthSlotIndex = getSlotIndex(slot); + Collections.reverse(states); + for (CallIndicatorIconState state : states) { + if (!state.isNoCalling) { + StatusBarIconHolder holder = callStrengthSlot.getHolderForTag(state.subId); + if (holder == null) { + holder = StatusBarIconHolder.fromCallIndicatorState(mContext, state); + setIcon(callStrengthSlotIndex, holder); + } else { + holder.setIcon(new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(), + Icon.createWithResource(mContext, state.callStrengthResId), 0, 0, + state.callStrengthDescription)); + setIcon(callStrengthSlotIndex, holder); + } + } + setIconVisibility(slot, !state.isNoCalling, state.subId); + } + } + + /** + * Accept a list of CallIndicatorIconStates, and show the no calling icons. + * @param slot StatusBar slot for the no calling icons + * @param states All of the no Calling & SMS icon states + */ + @Override + public void setNoCallingIcons(String slot, List<CallIndicatorIconState> states) { Slot noCallingSlot = getSlot(slot); - int slotIndex = getSlotIndex(slot); + int noCallingSlotIndex = getSlotIndex(slot); + Collections.reverse(states); for (CallIndicatorIconState state : states) { - StatusBarIconHolder holder = noCallingSlot.getHolderForTag(state.subId); - if (holder == null) { - holder = StatusBarIconHolder.fromCallIndicatorState(mContext, state); - setIcon(slotIndex, holder); - } else { - int resId = state.isNoCalling ? state.noCallingResId : state.callStrengthResId; - String contentDescription = state.isNoCalling - ? state.noCallingDescription : state.callStrengthDescription; - holder.setIcon(new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(), - Icon.createWithResource(mContext, resId), 0, 0, contentDescription)); - setIcon(slotIndex, holder); + if (state.isNoCalling) { + StatusBarIconHolder holder = noCallingSlot.getHolderForTag(state.subId); + if (holder == null) { + holder = StatusBarIconHolder.fromCallIndicatorState(mContext, state); + setIcon(noCallingSlotIndex, holder); + } else { + holder.setIcon(new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(), + Icon.createWithResource(mContext, state.noCallingResId), 0, 0, + state.noCallingDescription)); + setIcon(noCallingSlotIndex, holder); + } } + setIconVisibility(slot, state.isNoCalling, state.subId); } } @@ -282,9 +311,15 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu } } + /** */ public void setIconVisibility(String slot, boolean visibility) { + setIconVisibility(slot, visibility, 0); + } + + /** */ + public void setIconVisibility(String slot, boolean visibility, int tag) { int index = getSlotIndex(slot); - StatusBarIconHolder holder = getIcon(index, 0); + StatusBarIconHolder holder = getIcon(index, tag); if (holder == null || holder.isVisible() == visibility) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java index a1a2d30e9b00..19db02a71777 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java @@ -83,7 +83,6 @@ public class StatusBarIconHolder { holder.mIcon = new StatusBarIcon(UserHandle.SYSTEM, context.getPackageName(), Icon.createWithResource(context, resId), 0, 0, contentDescription); holder.mTag = state.subId; - holder.setVisible(true); return holder; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index 9ee7b09589d8..3445826eefbe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -50,6 +50,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba private final String mSlotEthernet; private final String mSlotVpn; private final String mSlotNoCalling; + private final String mSlotCallStrength; private final Context mContext; private final StatusBarIconController mIconController; @@ -83,6 +84,8 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba mSlotEthernet = mContext.getString(com.android.internal.R.string.status_bar_ethernet); mSlotVpn = mContext.getString(com.android.internal.R.string.status_bar_vpn); mSlotNoCalling = mContext.getString(com.android.internal.R.string.status_bar_no_calling); + mSlotCallStrength = + mContext.getString(com.android.internal.R.string.status_bar_call_strength); mActivityEnabled = mContext.getResources().getBoolean(R.bool.config_showActivity); mIconController = iconController; @@ -212,8 +215,10 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba state.callStrengthResId = statusIcon.icon; state.callStrengthDescription = statusIcon.contentDescription; } - mIconController.setCallIndicatorIcons( - mSlotNoCalling, CallIndicatorIconState.copyStates(mCallIndicatorStates)); + mIconController.setCallStrengthIcons(mSlotCallStrength, + CallIndicatorIconState.copyStates(mCallIndicatorStates)); + mIconController.setNoCallingIcons(mSlotNoCalling, + CallIndicatorIconState.copyStates(mCallIndicatorStates)); } @Override @@ -300,6 +305,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba mIconController.removeAllIconsForSlot(mSlotMobile); mIconController.removeAllIconsForSlot(mSlotNoCalling); + mIconController.removeAllIconsForSlot(mSlotCallStrength); mMobileStates.clear(); List<CallIndicatorIconState> noCallingStates = new ArrayList<CallIndicatorIconState>(); noCallingStates.addAll(mCallIndicatorStates); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java index 6032e51ab554..979951409aa9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java @@ -30,8 +30,8 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; +import com.android.internal.R; import com.android.internal.logging.MetricsLogger; -import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; @@ -99,7 +99,7 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { assertEquals(Tile.STATE_INACTIVE, mTile.getState().state); assertEquals(mTile.getState().label.toString(), - mContext.getString(R.string.quick_settings_reduce_bright_colors_label)); + mContext.getString(R.string.reduce_bright_colors_feature_name)); } @Test @@ -110,7 +110,7 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { assertEquals(Tile.STATE_ACTIVE, mTile.getState().state); assertEquals(mTile.getState().label.toString(), - mContext.getString(R.string.quick_settings_reduce_bright_colors_label)); + mContext.getString(R.string.reduce_bright_colors_feature_name)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java index 203ece9532ef..8ad6271bfc7e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java @@ -66,7 +66,11 @@ public class FakeStatusBarIconController extends BaseLeakChecker<IconManager> } @Override - public void setCallIndicatorIcons(String slot, List<CallIndicatorIconState> states) { + public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) { + } + + @Override + public void setNoCallingIcons(String slot, List<CallIndicatorIconState> states) { } @Override diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index cbce7203ca08..7f96aff28016 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1792,7 +1792,7 @@ class StorageManagerService extends IStorageManager.Stub public StorageManagerService(Context context) { sSelf = this; mVoldAppDataIsolationEnabled = SystemProperties.getBoolean( - ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY, true); + ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY, false); mContext = context; mResolver = mContext.getContentResolver(); mCallbacks = new Callbacks(FgThread.get().getLooper()); diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java index 56aabc208027..d756c1ffd00f 100644 --- a/services/core/java/com/android/server/VpnManagerService.java +++ b/services/core/java/com/android/server/VpnManagerService.java @@ -352,7 +352,10 @@ public class VpnManagerService extends IVpnManager.Stub { @Override public void startLegacyVpn(VpnProfile profile) { int user = UserHandle.getUserId(mDeps.getCallingUid()); - final LinkProperties egress = mCm.getActiveLinkProperties(); + // Note that if the caller is not system (uid >= Process.FIRST_APPLICATION_UID), + // the code might not work well since getActiveNetwork might return null if the uid is + // blocked by NetworkPolicyManagerService. + final LinkProperties egress = mCm.getLinkProperties(mCm.getActiveNetwork()); if (egress == null) { throw new IllegalStateException("Missing active network connection"); } diff --git a/services/core/java/com/android/server/WatchableIntentResolver.java b/services/core/java/com/android/server/WatchedIntentResolver.java index 2ef94f17e5d9..e514f3c6fd59 100644 --- a/services/core/java/com/android/server/WatchableIntentResolver.java +++ b/services/core/java/com/android/server/WatchedIntentResolver.java @@ -31,7 +31,7 @@ import java.util.List; * @param <R> The resolver type. * {@hide} */ -public abstract class WatchableIntentResolver<F, R extends Object> +public abstract class WatchedIntentResolver<F, R extends Object> extends IntentResolver<F, R> implements Watchable { diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 3c445ae4b667..1b352c728554 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -160,6 +160,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -559,6 +560,45 @@ public final class ActiveServices { return smap != null ? smap.mStartingBackground.size() >= mMaxStartingBackground : false; } + boolean hasForegroundServiceNotificationLocked(String pkg, int userId, String channelId) { + final ServiceMap smap = mServiceMap.get(userId); + if (smap != null) { + for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) { + final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i); + if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) { + if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG_SERVICE, "Channel u" + userId + "/pkg=" + pkg + + "/channelId=" + channelId + + " has fg service notification"); + } + return true; + } + } + } + } + return false; + } + + void stopForegroundServicesForChannelLocked(String pkg, int userId, String channelId) { + final ServiceMap smap = mServiceMap.get(userId); + if (smap != null) { + for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) { + final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i); + if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) { + if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG_SERVICE, "Stopping FGS u" + userId + "/pkg=" + pkg + + "/channelId=" + channelId + + " for conversation channel clear"); + } + stopServiceLocked(sr, false); + } + } + } + } + } + private ServiceMap getServiceMapLocked(int callingUser) { ServiceMap smap = mServiceMap.get(callingUser); if (smap == null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0e8644a6569e..c4548a3070a7 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -15911,6 +15911,22 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override + public boolean hasForegroundServiceNotification(String pkg, int userId, + String channelId) { + synchronized (ActivityManagerService.this) { + return mServices.hasForegroundServiceNotificationLocked(pkg, userId, channelId); + } + } + + @Override + public void stopForegroundServicesForChannel(String pkg, int userId, + String channelId) { + synchronized (ActivityManagerService.this) { + mServices.stopForegroundServicesForChannelLocked(pkg, userId, channelId); + } + } + + @Override public void registerProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.registerProcessObserver(processObserver); } diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS index 9e79b02f8c96..273b9c3430b7 100644 --- a/services/core/java/com/android/server/am/OWNERS +++ b/services/core/java/com/android/server/am/OWNERS @@ -30,6 +30,10 @@ per-file BatteryExternalStats* = file:/BATTERY_STATS_OWNERS michaelwr@google.com narayan@google.com +# Voice Interaction +per-file *Assist* = file:/core/java/android/service/voice/OWNERS +per-file *Voice* = file:/core/java/android/service/voice/OWNERS + per-file SettingsToPropertiesMapper.java = omakoto@google.com, svetoslavganov@google.com, yamasani@google.com per-file CarUserSwitchingDialog.java = keunyoung@google.com, felipeal@google.com, gurunagarajan@google.com diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 442cdd922213..51bcde869189 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -786,7 +786,7 @@ public final class ProcessList { mAppDataIsolationEnabled = SystemProperties.getBoolean(ANDROID_APP_DATA_ISOLATION_ENABLED_PROPERTY, true); mVoldAppDataIsolationEnabled = SystemProperties.getBoolean( - ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY, true); + ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY, false); mAppDataIsolationAllowlistedApps = new ArrayList<>( SystemConfig.getInstance().getAppDataIsolationWhitelistedApps()); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 2e6cfdcf141f..804550b8782d 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3871,7 +3871,9 @@ public class AudioService extends IAudioService.Stub * @return true if microphone is reported as muted by primary HAL */ public boolean isMicrophoneMuted() { - return mMicMuteFromSystemCached && !mMicMuteFromPrivacyToggle; + return mMicMuteFromSystemCached + && (!mMicMuteFromPrivacyToggle + || mMicMuteFromApi || mMicMuteFromRestrictions || mMicMuteFromSwitch); } private boolean isMicrophoneSupposedToBeMuted() { diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java index f88820083768..6017e92afc1c 100644 --- a/services/core/java/com/android/server/biometrics/AuthSession.java +++ b/services/core/java/com/android/server/biometrics/AuthSession.java @@ -195,7 +195,8 @@ public final class AuthSession implements IBinder.DeathRecipient { final int cookie = mRandom.nextInt(Integer.MAX_VALUE - 1) + 1; final boolean requireConfirmation = isConfirmationRequired(sensor); sensor.goToStateWaitingForCookie(requireConfirmation, mToken, mOperationId, - mUserId, mSensorReceiver, mOpPackageName, cookie); + mUserId, mSensorReceiver, mOpPackageName, cookie, + mPromptInfo.isAllowBackgroundAuthentication()); } } @@ -596,7 +597,8 @@ public final class AuthSession implements IBinder.DeathRecipient { mPreAuthInfo.confirmationRequested, FrameworkStatsLog.BIOMETRIC_AUTHENTICATED__STATE__CONFIRMED, latency, - mDebugEnabled); + mDebugEnabled, + -1 /* sensorId */); } else { final long latency = System.currentTimeMillis() - mStartTimeMs; @@ -624,7 +626,8 @@ public final class AuthSession implements IBinder.DeathRecipient { error, 0 /* vendorCode */, mDebugEnabled, - latency); + latency, + -1 /* sensorId */); } } diff --git a/services/core/java/com/android/server/biometrics/BiometricSensor.java b/services/core/java/com/android/server/biometrics/BiometricSensor.java index 85de81bb3491..c9e148f9b6ff 100644 --- a/services/core/java/com/android/server/biometrics/BiometricSensor.java +++ b/services/core/java/com/android/server/biometrics/BiometricSensor.java @@ -103,11 +103,12 @@ public abstract class BiometricSensor { void goToStateWaitingForCookie(boolean requireConfirmation, IBinder token, long sessionId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie) + int cookie, boolean allowBackgroundAuthentication) throws RemoteException { mCookie = cookie; impl.prepareForAuthentication(requireConfirmation, token, - sessionId, userId, sensorReceiver, opPackageName, mCookie); + sessionId, userId, sensorReceiver, opPackageName, mCookie, + allowBackgroundAuthentication); mSensorState = STATE_WAITING_FOR_COOKIE; } diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java index 9617bb09e153..79e75b16dbf2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -55,7 +55,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> @Nullable private final TaskStackListener mTaskStackListener; private final LockoutTracker mLockoutTracker; private final boolean mIsRestricted; - private final boolean mIsKeyguard; + private final boolean mAllowBackgroundAuthentication; protected final long mOperationId; @@ -68,7 +68,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> int targetUserId, long operationId, boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsModality, int statsClient, @Nullable TaskStackListener taskStackListener, - @NonNull LockoutTracker lockoutTracker, boolean isKeyguard) { + @NonNull LockoutTracker lockoutTracker, boolean allowBackgroundAuthentication) { super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId, statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient); mIsStrongBiometric = isStrongBiometric; @@ -79,7 +79,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> mTaskStackListener = taskStackListener; mLockoutTracker = lockoutTracker; mIsRestricted = restricted; - mIsKeyguard = isKeyguard; + mAllowBackgroundAuthentication = allowBackgroundAuthentication; } public @LockoutTracker.LockoutMode int handleFailedAttempt(int userId) { @@ -120,7 +120,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> } public boolean isKeyguard() { - return mIsKeyguard; + return Utils.isKeyguard(getContext(), getOwnerString()); } @Override @@ -152,9 +152,15 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> pm.incrementAuthForUser(getTargetUserId(), authenticated); } + if (mAllowBackgroundAuthentication) { + Slog.w(TAG, "Allowing background authentication," + + " this is allowed only for platform or test invocations"); + } + // Ensure authentication only succeeds if the client activity is on top. boolean isBackgroundAuth = false; - if (authenticated && !Utils.isKeyguard(getContext(), getOwnerString()) + if (!mAllowBackgroundAuthentication && authenticated + && !Utils.isKeyguard(getContext(), getOwnerString()) && !Utils.isSystem(getContext(), getOwnerString())) { final List<ActivityManager.RunningTaskInfo> tasks = mActivityTaskManager.getTasks(1); diff --git a/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java index de571863dbd4..282261e6556f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java @@ -127,7 +127,8 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide getContext().getPackageName(), mBiometricUtils, getSensorId(), mAuthenticatorIds); FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, mStatsModality, - BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_HAL); + BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_HAL, + -1 /* sensorId */); mCurrentTask.start(mRemoveCallback); } diff --git a/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java b/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java index e3feb74248ec..7f6903a17b32 100644 --- a/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java @@ -118,7 +118,8 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> getTargetUserId(), identifier.getBiometricId()); FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, mStatsModality, - BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_FRAMEWORK); + BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_FRAMEWORK, + -1 /* sensorId */); } mEnrolledList.clear(); } diff --git a/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java index edde3d496e7c..4da644d23dec 100644 --- a/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java @@ -126,7 +126,8 @@ public abstract class LoggableMonitor { mStatsClient, acquiredInfo, vendorCode, - Utils.isDebugEnabled(context, targetUserId)); + Utils.isDebugEnabled(context, targetUserId), + -1 /* sensorId */); } protected final void logOnError(Context context, int error, int vendorCode, int targetUserId) { @@ -164,7 +165,8 @@ public abstract class LoggableMonitor { error, vendorCode, Utils.isDebugEnabled(context, targetUserId), - sanitizeLatency(latency)); + sanitizeLatency(latency), + -1 /* sensorId */); } protected final void logOnAuthenticated(Context context, boolean authenticated, @@ -214,7 +216,8 @@ public abstract class LoggableMonitor { requireConfirmation, authState, sanitizeLatency(latency), - Utils.isDebugEnabled(context, targetUserId)); + Utils.isDebugEnabled(context, targetUserId), + -1 /* sensorId */); } protected final void logOnEnrolled(int targetUserId, long latency, boolean enrollSuccessful) { @@ -240,7 +243,8 @@ public abstract class LoggableMonitor { mStatsModality, targetUserId, sanitizeLatency(latency), - enrollSuccessful); + enrollSuccessful, + -1 /* sensorId */); } private long sanitizeLatency(long latency) { diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java index 2926260321f1..0002ad249376 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java @@ -61,10 +61,10 @@ public final class FaceAuthenticator extends IBiometricAuthenticator.Stub { @Override public void prepareForAuthentication(boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, - String opPackageName, int cookie) + String opPackageName, int cookie, boolean allowBackgroundAuthentication) throws RemoteException { mFaceService.prepareForAuthentication(mSensorId, requireConfirmation, token, operationId, - userId, sensorReceiver, opPackageName, cookie); + userId, sensorReceiver, opPackageName, cookie, allowBackgroundAuthentication); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java index a74e2da30077..9f5dc69b404e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java @@ -306,7 +306,8 @@ public class FaceService extends SystemService implements BiometricServiceCallba @Override // Binder call public void prepareForAuthentication(int sensorId, boolean requireConfirmation, IBinder token, long operationId, int userId, - IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie) { + IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, + boolean allowBackgroundAuthentication) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); final ServiceProvider provider = getProviderForSensor(sensorId); @@ -318,7 +319,7 @@ public class FaceService extends SystemService implements BiometricServiceCallba final boolean restricted = true; // BiometricPrompt is always restricted provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie, new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted, - BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, false /* isKeyguard */); + BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication); } @Override // Binder call diff --git a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java index 88edfbf12df1..9b6fb0b75c57 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java @@ -103,7 +103,8 @@ public interface ServiceProvider { void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, - @NonNull String opPackageName, boolean restricted, int statsClient, boolean isKeyguard); + @NonNull String opPackageName, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication); void cancelAuthentication(int sensorId, @NonNull IBinder token); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index 089cf1e4cee8..07d173c8da02 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -69,11 +69,11 @@ class FaceAuthenticationClient extends AuthenticationClient<ISession> implements @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @NonNull UsageStats usageStats, - @NonNull LockoutCache lockoutCache, boolean isKeyguard) { + @NonNull LockoutCache lockoutCache, boolean allowBackgroundAuthentication) { super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner, cookie, requireConfirmation, sensorId, isStrongBiometric, BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */, - lockoutCache, isKeyguard); + lockoutCache, allowBackgroundAuthentication); mUsageStats = usageStats; mLockoutCache = lockoutCache; mNotificationManager = context.getSystemService(NotificationManager.class); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java index ebf13e0417e5..ca29057c9888 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java @@ -27,6 +27,7 @@ import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSessionCallback; +import android.hardware.biometrics.common.ComponentInfo; import android.hardware.biometrics.face.IFace; import android.hardware.biometrics.face.SensorProps; import android.hardware.face.Face; @@ -137,8 +138,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { final List<ComponentInfoInternal> componentInfo = new ArrayList<>(); if (prop.commonProps.componentInfo != null) { - for (android.hardware.biometrics.common.ComponentInfo info - : prop.commonProps.componentInfo) { + for (ComponentInfo info : prop.commonProps.componentInfo) { componentInfo.add(new ComponentInfoInternal(info.componentId, info.hardwareVersion, info.firmwareVersion, info.serialNumber, info.softwareVersion)); @@ -445,7 +445,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, boolean restricted, int statsClient, - boolean isKeyguard) { + boolean allowBackgroundAuthentication) { mHandler.post(() -> { final IFace daemon = getHalInstance(); if (daemon == null) { @@ -466,7 +466,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { mContext, mSensors.get(sensorId).getLazySession(), token, callback, userId, operationId, restricted, opPackageName, cookie, false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient, - mUsageStats, mSensors.get(sensorId).getLockoutCache(), isKeyguard); + mUsageStats, mSensors.get(sensorId).getLockoutCache(), + allowBackgroundAuthentication); mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); } catch (RemoteException e) { Slog.e(getTag(), "Remote exception when scheduling authenticate", e); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java index c7d2f0f87b6c..c6f39aa07f26 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java @@ -546,7 +546,8 @@ public class Sensor { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, BiometricsProtoEnums.MODALITY_FACE, - BiometricsProtoEnums.ISSUE_HAL_DEATH); + BiometricsProtoEnums.ISSUE_HAL_DEATH, + -1 /* sensorId */); } mScheduler.recordCrashState(); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java index 55e9a8384a86..50756c89613c 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java @@ -387,7 +387,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, BiometricsProtoEnums.MODALITY_FACE, - BiometricsProtoEnums.ISSUE_HAL_DEATH); + BiometricsProtoEnums.ISSUE_HAL_DEATH, + -1 /* sensorId */); } mScheduler.recordCrashState(); @@ -638,7 +639,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter receiver, @NonNull String opPackageName, boolean restricted, int statsClient, - boolean isKeyguard) { + boolean allowBackgroundAuthentication) { mHandler.post(() -> { scheduleUpdateActiveUserWithoutHandler(userId); @@ -646,7 +647,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { final FaceAuthenticationClient client = new FaceAuthenticationClient(mContext, mLazyDaemon, token, receiver, userId, operationId, restricted, opPackageName, cookie, false /* requireConfirmation */, mSensorId, isStrongBiometric, - statsClient, mLockoutTracker, mUsageStats, isKeyguard); + statsClient, mLockoutTracker, mUsageStats, allowBackgroundAuthentication); mScheduler.scheduleClientMonitor(client); }); } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java index 3ca51d32797e..ff06a4a30a80 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java @@ -62,11 +62,11 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> { @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @NonNull LockoutTracker lockoutTracker, - @NonNull UsageStats usageStats, boolean isKeyguard) { + @NonNull UsageStats usageStats, boolean allowBackgroundAuthentication) { super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner, cookie, requireConfirmation, sensorId, isStrongBiometric, BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */, - lockoutTracker, isKeyguard); + lockoutTracker, allowBackgroundAuthentication); mUsageStats = usageStats; final Resources resources = getContext().getResources(); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java index 9e82ffcfadc6..81096802a78b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java @@ -62,10 +62,10 @@ public final class FingerprintAuthenticator extends IBiometricAuthenticator.Stub @Override public void prepareForAuthentication(boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, - String opPackageName, int cookie) + String opPackageName, int cookie, boolean allowBackgroundAuthentication) throws RemoteException { mFingerprintService.prepareForAuthentication(mSensorId, token, operationId, userId, - sensorReceiver, opPackageName, cookie); + sensorReceiver, opPackageName, cookie, allowBackgroundAuthentication); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index aa5afb728a9b..e4397fd158e1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -403,7 +403,7 @@ public class FingerprintService extends SystemService implements BiometricServic @Override // Binder call public void prepareForAuthentication(int sensorId, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie) { + int cookie, boolean allowBackgroundAuthentication) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); final ServiceProvider provider = getProviderForSensor(sensorId); @@ -415,7 +415,7 @@ public class FingerprintService extends SystemService implements BiometricServic final boolean restricted = true; // BiometricPrompt is always restricted provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie, new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted, - BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, false /* isKeyguard */); + BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication); } @Override // Binder call diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java index 0d50499bd02a..c09d2d37de44 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java @@ -96,7 +96,8 @@ public interface ServiceProvider { void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, - @NonNull String opPackageName, boolean restricted, int statsClient, boolean isKeyguard); + @NonNull String opPackageName, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication); void startPreparedClient(int sensorId, int cookie); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index e2743f624c37..76a47d382e4b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -59,11 +59,12 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @Nullable TaskStackListener taskStackListener, @NonNull LockoutCache lockoutCache, - @Nullable IUdfpsOverlayController udfpsOverlayController, boolean isKeyguard) { + @Nullable IUdfpsOverlayController udfpsOverlayController, + boolean allowBackgroundAuthentication) { super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner, cookie, requireConfirmation, sensorId, isStrongBiometric, BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener, - lockoutCache, isKeyguard); + lockoutCache, allowBackgroundAuthentication); mLockoutCache = lockoutCache; mUdfpsOverlayController = udfpsOverlayController; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 2c85dc94bdba..1b5def6c7063 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -29,6 +29,7 @@ import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSessionCallback; +import android.hardware.biometrics.common.ComponentInfo; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.biometrics.fingerprint.SensorProps; import android.hardware.fingerprint.Fingerprint; @@ -141,8 +142,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi final List<ComponentInfoInternal> componentInfo = new ArrayList<>(); if (prop.commonProps.componentInfo != null) { - for (android.hardware.biometrics.common.ComponentInfo info - : prop.commonProps.componentInfo) { + for (ComponentInfo info : prop.commonProps.componentInfo) { componentInfo.add(new ComponentInfoInternal(info.componentId, info.hardwareVersion, info.firmwareVersion, info.serialNumber, info.softwareVersion)); @@ -469,7 +469,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, boolean restricted, int statsClient, - boolean isKeyguard) { + boolean allowBackgroundAuthentication) { mHandler.post(() -> { final IFingerprint daemon = getHalInstance(); if (daemon == null) { @@ -491,7 +491,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi operationId, restricted, opPackageName, cookie, false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient, mTaskStackListener, mSensors.get(sensorId).getLockoutCache(), - mUdfpsOverlayController, isKeyguard); + mUdfpsOverlayController, allowBackgroundAuthentication); mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); } catch (RemoteException e) { Slog.e(getTag(), "Remote exception when scheduling authenticate", e); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java index b9dee7d1e321..5631647816ec 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java @@ -526,7 +526,8 @@ class Sensor { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, BiometricsProtoEnums.MODALITY_FINGERPRINT, - BiometricsProtoEnums.ISSUE_HAL_DEATH); + BiometricsProtoEnums.ISSUE_HAL_DEATH, + -1 /* sensorId */); } mScheduler.recordCrashState(); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index f112549002fb..f2992cccbe09 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -390,7 +390,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, BiometricsProtoEnums.MODALITY_FINGERPRINT, - BiometricsProtoEnums.ISSUE_HAL_DEATH); + BiometricsProtoEnums.ISSUE_HAL_DEATH, + -1 /* sensorId */); } mScheduler.recordCrashState(); @@ -611,7 +612,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter listener, @NonNull String opPackageName, boolean restricted, int statsClient, - boolean isKeyguard) { + boolean allowBackgroundAuthentication) { mHandler.post(() -> { scheduleUpdateActiveUserWithoutHandler(userId); @@ -620,7 +621,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider mContext, mLazyDaemon, token, listener, userId, operationId, restricted, opPackageName, cookie, false /* requireConfirmation */, mSensorProperties.sensorId, isStrongBiometric, statsClient, - mTaskStackListener, mLockoutTracker, mUdfpsOverlayController, isKeyguard); + mTaskStackListener, mLockoutTracker, mUdfpsOverlayController, + allowBackgroundAuthentication); mScheduler.scheduleClientMonitor(client); }); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java index db371125478d..97f128748bcc 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java @@ -59,11 +59,12 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi int sensorId, boolean isStrongBiometric, int statsClient, @NonNull TaskStackListener taskStackListener, @NonNull LockoutFrameworkImpl lockoutTracker, - @Nullable IUdfpsOverlayController udfpsOverlayController, boolean isKeyguard) { + @Nullable IUdfpsOverlayController udfpsOverlayController, + boolean allowBackgroundAuthentication) { super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner, cookie, requireConfirmation, sensorId, isStrongBiometric, BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener, - lockoutTracker, isKeyguard); + lockoutTracker, allowBackgroundAuthentication); mLockoutFrameworkImpl = lockoutTracker; mUdfpsOverlayController = udfpsOverlayController; } diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java index 95915b7809f3..1003c26f966e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java @@ -59,7 +59,8 @@ public final class IrisAuthenticator extends IBiometricAuthenticator.Stub { @Override public void prepareForAuthentication(boolean requireConfirmation, IBinder token, long sessionId, int userId, IBiometricSensorReceiver sensorReceiver, - String opPackageName, int cookie) throws RemoteException { + String opPackageName, int cookie, boolean allowBackgroundAuthentication) + throws RemoteException { } @Override diff --git a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java index 181a10d2a63e..0c0d45995a2b 100644 --- a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java +++ b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java @@ -28,6 +28,8 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.graphics.drawable.Icon; +import android.net.ConnectivityResources; import android.net.NetworkSpecifier; import android.net.TelephonyNetworkSpecifier; import android.net.wifi.WifiInfo; @@ -40,7 +42,7 @@ import android.util.SparseArray; import android.util.SparseIntArray; import android.widget.Toast; -import com.android.internal.R; +import com.android.connectivity.resources.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; @@ -82,6 +84,7 @@ public class NetworkNotificationManager { // The context is for the current user (system server) private final Context mContext; + private final Resources mResources; private final TelephonyManager mTelephonyManager; // The notification manager is created from a context for User.ALL, so notifications // will be sent to all users. @@ -96,6 +99,7 @@ public class NetworkNotificationManager { (NotificationManager) c.createContextAsUser(UserHandle.ALL, 0 /* flags */) .getSystemService(Context.NOTIFICATION_SERVICE); mNotificationTypeMap = new SparseIntArray(); + mResources = new ConnectivityResources(mContext).get(); } @VisibleForTesting @@ -113,20 +117,19 @@ public class NetworkNotificationManager { return -1; } - private static String getTransportName(final int transportType) { - Resources r = Resources.getSystem(); - String[] networkTypes = r.getStringArray(R.array.network_switch_type_name); + private String getTransportName(final int transportType) { + String[] networkTypes = mResources.getStringArray(R.array.network_switch_type_name); try { return networkTypes[transportType]; } catch (IndexOutOfBoundsException e) { - return r.getString(R.string.network_switch_type_name_unknown); + return mResources.getString(R.string.network_switch_type_name_unknown); } } private static int getIcon(int transportType) { return (transportType == TRANSPORT_WIFI) - ? R.drawable.stat_notify_wifi_in_range : // TODO: Distinguish ! from ?. - R.drawable.stat_notify_rssi_in_range; + ? R.drawable.stat_notify_wifi_in_range // TODO: Distinguish ! from ?. + : R.drawable.stat_notify_rssi_in_range; } /** @@ -194,10 +197,10 @@ public class NetworkNotificationManager { tag, nameOf(eventId), getTransportName(transportType), name, highPriority)); } - Resources r = mContext.getResources(); + final Resources r = mResources; final CharSequence title; final CharSequence details; - int icon = getIcon(transportType); + Icon icon = Icon.createWithResource(r, getIcon(transportType)); if (notifyType == NotificationType.NO_INTERNET && transportType == TRANSPORT_WIFI) { title = r.getString(R.string.wifi_no_internet, name); details = r.getString(R.string.wifi_no_internet_detailed); @@ -272,8 +275,7 @@ public class NetworkNotificationManager { .setSmallIcon(icon) .setAutoCancel(true) .setTicker(title) - .setColor(mContext.getColor( - com.android.internal.R.color.system_notification_accent_color)) + .setColor(mContext.getColor(android.R.color.system_notification_accent_color)) .setContentTitle(title) .setContentIntent(intent) .setLocalOnly(true) @@ -353,7 +355,7 @@ public class NetworkNotificationManager { public void showToast(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) { String fromTransport = getTransportName(approximateTransportType(fromNai)); String toTransport = getTransportName(approximateTransportType(toNai)); - String text = mContext.getResources().getString( + String text = mResources.getString( R.string.network_switch_metered_toast, fromTransport, toTransport); Toast.makeText(mContext, text, Toast.LENGTH_LONG).show(); } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 82ca820ec4d7..f8a913aeb7cd 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.ADD_TRUSTED_DISPLAY; import static android.Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT; import static android.Manifest.permission.CAPTURE_VIDEO_OUTPUT; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; +import static android.hardware.display.DisplayManager.EventsMask; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; @@ -28,6 +29,7 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLI import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED; +import static android.hardware.display.DisplayManagerGlobal.DisplayEvent; import static android.hardware.display.DisplayViewport.VIEWPORT_EXTERNAL; import static android.hardware.display.DisplayViewport.VIEWPORT_INTERNAL; import static android.hardware.display.DisplayViewport.VIEWPORT_VIRTUAL; @@ -125,6 +127,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Optional; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; /** @@ -820,14 +823,16 @@ public final class DisplayManagerService extends SystemService { } private void registerCallbackInternal(IDisplayManagerCallback callback, int callingPid, - int callingUid) { + int callingUid, @EventsMask long eventsMask) { synchronized (mSyncRoot) { - if (mCallbacks.get(callingPid) != null) { - throw new SecurityException("The calling process has already " - + "registered an IDisplayManagerCallback."); + CallbackRecord record = mCallbacks.get(callingPid); + + if (record != null) { + record.updateEventsMask(eventsMask); + return; } - CallbackRecord record = new CallbackRecord(callingPid, callingUid, callback); + record = new CallbackRecord(callingPid, callingUid, callback, eventsMask); try { IBinder binder = callback.asBinder(); binder.linkToDeath(record, 0); @@ -1695,7 +1700,7 @@ public final class DisplayManagerService extends SystemService { } } - private void sendDisplayEventLocked(int displayId, int event) { + private void sendDisplayEventLocked(int displayId, @DisplayEvent int event) { Message msg = mHandler.obtainMessage(MSG_DELIVER_DISPLAY_EVENT, displayId, event); mHandler.sendMessage(msg); } @@ -1724,7 +1729,8 @@ public final class DisplayManagerService extends SystemService { // Runs on Handler thread. // Delivers display event notifications to callbacks. - private void deliverDisplayEvent(int displayId, ArraySet<Integer> uids, int event) { + private void deliverDisplayEvent(int displayId, ArraySet<Integer> uids, + @DisplayEvent int event) { if (DEBUG) { Slog.d(TAG, "Delivering display event: displayId=" + displayId + ", event=" + event); @@ -2059,13 +2065,20 @@ public final class DisplayManagerService extends SystemService { public final int mPid; public final int mUid; private final IDisplayManagerCallback mCallback; + private @EventsMask AtomicLong mEventsMask; public boolean mWifiDisplayScanRequested; - CallbackRecord(int pid, int uid, IDisplayManagerCallback callback) { + CallbackRecord(int pid, int uid, IDisplayManagerCallback callback, + @EventsMask long eventsMask) { mPid = pid; mUid = uid; mCallback = callback; + mEventsMask = new AtomicLong(eventsMask); + } + + public void updateEventsMask(@EventsMask long eventsMask) { + mEventsMask.set(eventsMask); } @Override @@ -2076,7 +2089,11 @@ public final class DisplayManagerService extends SystemService { onCallbackDied(this); } - public void notifyDisplayEventAsync(int displayId, int event) { + public void notifyDisplayEventAsync(int displayId, @DisplayEvent int event) { + if (!shouldSendEvent(event)) { + return; + } + try { mCallback.onDisplayEvent(displayId, event); } catch (RemoteException ex) { @@ -2085,6 +2102,22 @@ public final class DisplayManagerService extends SystemService { binderDied(); } } + + private boolean shouldSendEvent(@DisplayEvent int event) { + final long mask = mEventsMask.get(); + switch (event) { + case DisplayManagerGlobal.EVENT_DISPLAY_ADDED: + return (mask & DisplayManager.EVENT_FLAG_DISPLAY_ADDED) != 0; + case DisplayManagerGlobal.EVENT_DISPLAY_CHANGED: + return (mask & DisplayManager.EVENT_FLAG_DISPLAY_CHANGED) != 0; + case DisplayManagerGlobal.EVENT_DISPLAY_REMOVED: + return (mask & DisplayManager.EVENT_FLAG_DISPLAY_REMOVED) != 0; + default: + // This should never happen. + Slog.e(TAG, "Unknown display event " + event); + return true; + } + } } @VisibleForTesting @@ -2149,6 +2182,14 @@ public final class DisplayManagerService extends SystemService { @Override // Binder call public void registerCallback(IDisplayManagerCallback callback) { + registerCallbackWithEventMask(callback, DisplayManager.EVENT_FLAG_DISPLAY_ADDED + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED + | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED); + } + + @Override // Binder call + public void registerCallbackWithEventMask(IDisplayManagerCallback callback, + @EventsMask long eventsMask) { if (callback == null) { throw new IllegalArgumentException("listener must not be null"); } @@ -2157,7 +2198,7 @@ public final class DisplayManagerService extends SystemService { final int callingUid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { - registerCallbackInternal(callback, callingPid, callingUid); + registerCallbackInternal(callback, callingPid, callingUid, eventsMask); } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/core/java/com/android/server/display/color/ColorDisplayShellCommand.java b/services/core/java/com/android/server/display/color/ColorDisplayShellCommand.java index b4555f851d4d..7d9b0aa03179 100644 --- a/services/core/java/com/android/server/display/color/ColorDisplayShellCommand.java +++ b/services/core/java/com/android/server/display/color/ColorDisplayShellCommand.java @@ -28,7 +28,7 @@ class ColorDisplayShellCommand extends ShellCommand { + " Shows this message.\n" + " set-saturation LEVEL\n" + " Sets the device saturation to the given LEVEL, 0-100 inclusive.\n" - + " set-layer-saturation CALLER_PACKAGE TARGET_PACKAGE LEVEL\n" + + " set-layer-saturation LEVEL CALLER_PACKAGE TARGET_PACKAGE\n" + " Sets the saturation LEVEL for all layers of the TARGET_PACKAGE, attributed\n" + " to the CALLER_PACKAGE. The lowest LEVEL from any CALLER_PACKAGE is applied.\n"; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index e58836659189..eb4f9d305a27 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3576,15 +3576,30 @@ public class NotificationManagerService extends SystemService { pkg, uid, channelId, conversationId, true, includeDeleted); } + // Returns 'true' if the given channel has a notification associated + // with an active foreground service. + private void enforceDeletingChannelHasNoFgService(String pkg, int userId, + String channelId) { + if (mAmi.hasForegroundServiceNotification(pkg, userId, channelId)) { + Slog.w(TAG, "Package u" + userId + "/" + pkg + + " may not delete notification channel '" + + channelId + "' with fg service"); + throw new SecurityException("Not allowed to delete channel " + channelId + + " with a foreground service"); + } + } + @Override public void deleteNotificationChannel(String pkg, String channelId) { checkCallerIsSystemOrSameApp(pkg); final int callingUid = Binder.getCallingUid(); + final int callingUser = UserHandle.getUserId(callingUid); if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(channelId)) { throw new IllegalArgumentException("Cannot delete default channel"); } + enforceDeletingChannelHasNoFgService(pkg, callingUser, channelId); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channelId, 0, 0, true, - UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null); + callingUser, REASON_CHANNEL_BANNED, null); mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, channelId); mListeners.notifyNotificationChannelChanged(pkg, UserHandle.getUserHandleForUid(callingUid), @@ -3597,19 +3612,23 @@ public class NotificationManagerService extends SystemService { public void deleteConversationNotificationChannels(String pkg, int uid, String conversationId) { checkCallerIsSystem(); - final int callingUid = Binder.getCallingUid(); List<NotificationChannel> channels = mPreferencesHelper.getNotificationChannelsByConversationId( pkg, uid, conversationId); if (!channels.isEmpty()) { + // Preflight for fg service notifications in these channels: do nothing + // unless they're all eligible + final int appUserId = UserHandle.getUserId(uid); for (NotificationChannel nc : channels) { + final String channelId = nc.getId(); + mAmi.stopForegroundServicesForChannel(pkg, appUserId, channelId); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, nc.getId(), 0, 0, true, - UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null); - mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, nc.getId()); + appUserId, REASON_CHANNEL_BANNED, null); + mPreferencesHelper.deleteNotificationChannel(pkg, uid, channelId); mListeners.notifyNotificationChannelChanged(pkg, - UserHandle.getUserHandleForUid(callingUid), + UserHandle.getUserHandleForUid(uid), mPreferencesHelper.getNotificationChannel( - pkg, callingUid, nc.getId(), true), + pkg, uid, channelId, true), NOTIFICATION_CHANNEL_OR_GROUP_DELETED); } handleSavePolicyFile(); @@ -3640,13 +3659,20 @@ public class NotificationManagerService extends SystemService { NotificationChannelGroup groupToDelete = mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, callingUid); if (groupToDelete != null) { + // Preflight for allowability + final int userId = UserHandle.getUserId(callingUid); + List<NotificationChannel> groupChannels = groupToDelete.getChannels(); + for (int i = 0; i < groupChannels.size(); i++) { + enforceDeletingChannelHasNoFgService(pkg, userId, + groupChannels.get(i).getId()); + } List<NotificationChannel> deletedChannels = mPreferencesHelper.deleteNotificationChannelGroup(pkg, callingUid, groupId); for (int i = 0; i < deletedChannels.size(); i++) { final NotificationChannel deletedChannel = deletedChannels.get(i); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, deletedChannel.getId(), 0, 0, true, - UserHandle.getUserId(Binder.getCallingUid()), REASON_CHANNEL_BANNED, + userId, REASON_CHANNEL_BANNED, null); mListeners.notifyNotificationChannelChanged(pkg, UserHandle.getUserHandleForUid(callingUid), diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index dbd121137b57..27b164830572 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -103,7 +103,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -312,7 +311,7 @@ public final class OverlayManagerService extends SystemService { // Initialize any users that can't be switched to, as their state would // never be setup in onSwitchUser(). We will switch to the system user right // after this, and its state will be setup there. - updatePackageManager(mImpl.updateOverlaysForUser(users.get(i).id)); + updatePackageManagerLocked(mImpl.updateOverlaysForUser(users.get(i).id)); } } } @@ -329,9 +328,8 @@ public final class OverlayManagerService extends SystemService { // ensure overlays in the settings are up-to-date, and propagate // any asset changes to the rest of the system synchronized (mLock) { - updateActivityManager(updatePackageManager(mImpl.updateOverlaysForUser(newUserId))); + updateTargetPackagesLocked(mImpl.updateOverlaysForUser(newUserId)); } - persistSettings(); } finally { traceEnd(TRACE_TAG_RRO); } @@ -415,7 +413,8 @@ public final class OverlayManagerService extends SystemService { packageName, userId); if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) { try { - updateTargetPackages(mImpl.onPackageAdded(packageName, userId)); + updateTargetPackagesLocked( + mImpl.onPackageAdded(packageName, userId)); } catch (OperationFailedException e) { Slog.e(TAG, "onPackageAdded internal error", e); } @@ -437,7 +436,8 @@ public final class OverlayManagerService extends SystemService { packageName, userId); if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) { try { - updateTargetPackages(mImpl.onPackageChanged(packageName, userId)); + updateTargetPackagesLocked( + mImpl.onPackageChanged(packageName, userId)); } catch (OperationFailedException e) { Slog.e(TAG, "onPackageChanged internal error", e); } @@ -459,7 +459,8 @@ public final class OverlayManagerService extends SystemService { packageName, userId); if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) { try { - updateTargetPackages(mImpl.onPackageReplacing(packageName, userId)); + updateTargetPackagesLocked( + mImpl.onPackageReplacing(packageName, userId)); } catch (OperationFailedException e) { Slog.e(TAG, "onPackageReplacing internal error", e); } @@ -481,7 +482,8 @@ public final class OverlayManagerService extends SystemService { packageName, userId); if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) { try { - updateTargetPackages(mImpl.onPackageReplaced(packageName, userId)); + updateTargetPackagesLocked( + mImpl.onPackageReplaced(packageName, userId)); } catch (OperationFailedException e) { Slog.e(TAG, "onPackageReplaced internal error", e); } @@ -500,7 +502,7 @@ public final class OverlayManagerService extends SystemService { for (int userId : userIds) { synchronized (mLock) { mPackageManager.onPackageRemoved(packageName, userId); - updateTargetPackages(mImpl.onPackageRemoved(packageName, userId)); + updateTargetPackagesLocked(mImpl.onPackageRemoved(packageName, userId)); } } } finally { @@ -519,7 +521,7 @@ public final class OverlayManagerService extends SystemService { try { traceBegin(TRACE_TAG_RRO, "OMS ACTION_USER_ADDED"); synchronized (mLock) { - updatePackageManager(mImpl.updateOverlaysForUser(userId)); + updatePackageManagerLocked(mImpl.updateOverlaysForUser(userId)); } } finally { traceEnd(TRACE_TAG_RRO); @@ -624,7 +626,8 @@ public final class OverlayManagerService extends SystemService { try { synchronized (mLock) { try { - updateTargetPackages(mImpl.setEnabled(overlay, enable, realUserId)); + updateTargetPackagesLocked( + mImpl.setEnabled(overlay, enable, realUserId)); return true; } catch (OperationFailedException e) { return false; @@ -656,9 +659,10 @@ public final class OverlayManagerService extends SystemService { try { synchronized (mLock) { try { - mImpl.setEnabledExclusive(overlay, - false /* withinCategory */, realUserId) - .ifPresent(OverlayManagerService.this::updateTargetPackages); + mImpl.setEnabledExclusive( + overlay, false /* withinCategory */, realUserId) + .ifPresent( + OverlayManagerService.this::updateTargetPackagesLocked); return true; } catch (OperationFailedException e) { return false; @@ -693,7 +697,7 @@ public final class OverlayManagerService extends SystemService { try { mImpl.setEnabledExclusive(overlay, true /* withinCategory */, realUserId) - .ifPresent(OverlayManagerService.this::updateTargetPackages); + .ifPresent(OverlayManagerService.this::updateTargetPackagesLocked); return true; } catch (OperationFailedException e) { return false; @@ -728,7 +732,7 @@ public final class OverlayManagerService extends SystemService { synchronized (mLock) { try { mImpl.setPriority(overlay, parentOverlay, realUserId) - .ifPresent(OverlayManagerService.this::updateTargetPackages); + .ifPresent(OverlayManagerService.this::updateTargetPackagesLocked); return true; } catch (OperationFailedException e) { return false; @@ -759,7 +763,8 @@ public final class OverlayManagerService extends SystemService { try { synchronized (mLock) { try { - updateTargetPackages(mImpl.setHighestPriority(overlay, realUserId)); + updateTargetPackagesLocked( + mImpl.setHighestPriority(overlay, realUserId)); return true; } catch (OperationFailedException e) { return false; @@ -791,7 +796,7 @@ public final class OverlayManagerService extends SystemService { synchronized (mLock) { try { mImpl.setLowestPriority(overlay, realUserId) - .ifPresent(OverlayManagerService.this::updateTargetPackages); + .ifPresent(OverlayManagerService.this::updateTargetPackagesLocked); return true; } catch (OperationFailedException e) { return false; @@ -945,27 +950,12 @@ public final class OverlayManagerService extends SystemService { throw new IllegalArgumentException("null transaction"); } - // map: userId -> set<package-name>: target packages of overlays in - // this transaction - final SparseArray<Set<String>> transactionTargets = new SparseArray<>(); - - // map: userId -> set<package-name>: packages that need to reload - // their resources due to changes to the overlays in this - // transaction - final SparseArray<List<String>> affectedPackagesToUpdate = new SparseArray<>(); - synchronized (mLock) { // execute the requests (as calling user) + Set<PackageAndUser> affectedPackagesToUpdate = null; for (final OverlayManagerTransaction.Request request : transaction) { - executeRequest(request).forEach( - target -> { - Set<String> userTargets = transactionTargets.get(target.userId); - if (userTargets == null) { - userTargets = new ArraySet<>(); - transactionTargets.put(target.userId, userTargets); - } - userTargets.add(target.packageName); - }); + affectedPackagesToUpdate = CollectionUtils.addAll(affectedPackagesToUpdate, + executeRequest(request)); } // past the point of no return: the entire transaction has been @@ -973,37 +963,11 @@ public final class OverlayManagerService extends SystemService { // system_server final long ident = Binder.clearCallingIdentity(); try { - persistSettings(); - - // inform the package manager about the new paths - for (int index = 0; index < transactionTargets.size(); index++) { - final int userId = transactionTargets.keyAt(index); - final List<String> affectedTargets = - updatePackageManager(transactionTargets.valueAt(index), userId); - affectedPackagesToUpdate.put(userId, affectedTargets); - } - } finally { - Binder.restoreCallingIdentity(ident); - } - } // synchronized (mLock) - - FgThread.getHandler().post(() -> { - final long ident = Binder.clearCallingIdentity(); - try { - // schedule apps to refresh - updateActivityManager(affectedPackagesToUpdate); - - // broadcast the ACTION_OVERLAY_CHANGED intents - for (int index = 0; index < transactionTargets.size(); index++) { - final int userId = transactionTargets.keyAt(index); - for (String pkg: transactionTargets.valueAt(index)) { - broadcastActionOverlayChanged(pkg, userId); - } - } + updateTargetPackagesLocked(affectedPackagesToUpdate); } finally { Binder.restoreCallingIdentity(ident); } - }); + } } @Override @@ -1382,32 +1346,37 @@ public final class OverlayManagerService extends SystemService { } } - private void updateTargetPackages(@Nullable PackageAndUser updatedTarget) { + private void updateTargetPackagesLocked(@Nullable PackageAndUser updatedTarget) { if (updatedTarget != null) { - updateTargetPackages(Set.of(updatedTarget)); + updateTargetPackagesLocked(Set.of(updatedTarget)); } } - private void updateTargetPackages(@Nullable Set<PackageAndUser> updatedTargets) { + private void updateTargetPackagesLocked(@Nullable Set<PackageAndUser> updatedTargets) { if (CollectionUtils.isEmpty(updatedTargets)) { return; } - persistSettings(); + persistSettingsLocked(); final SparseArray<ArraySet<String>> userTargets = groupTargetsByUserId(updatedTargets); - FgThread.getHandler().post(() -> { - for (int i = 0, n = userTargets.size(); i < n; i++) { - final ArraySet<String> targets = userTargets.valueAt(i); - final int userId = userTargets.keyAt(i); + for (int i = 0, n = userTargets.size(); i < n; i++) { + final ArraySet<String> targets = userTargets.valueAt(i); + final int userId = userTargets.keyAt(i); + final List<String> affectedPackages = updatePackageManagerLocked(targets, userId); + if (affectedPackages.isEmpty()) { + // The package manager paths are already up-to-date. + continue; + } - // Update the overlay paths in package manager. - final List<String> affectedPackages = updatePackageManager(targets, userId); + FgThread.getHandler().post(() -> { + // Send configuration changed events for all target packages that have been affected + // by overlay state changes. updateActivityManager(affectedPackages, userId); - // Overlays targeting shared libraries may cause more packages to need to be - // refreshed. + // Do not send broadcasts for all affected targets. Overlays targeting the framework + // or shared libraries may cause too many broadcasts to be sent at once. broadcastActionOverlayChanged(targets, userId); - } - }); + }); + } } @Nullable @@ -1430,20 +1399,17 @@ public final class OverlayManagerService extends SystemService { private static void broadcastActionOverlayChanged(@NonNull final Set<String> targetPackages, final int userId) { - CollectionUtils.forEach(targetPackages, - target -> broadcastActionOverlayChanged(target, userId)); - } - - private static void broadcastActionOverlayChanged(String targetPackage, final int userId) { - final Intent intent = new Intent(ACTION_OVERLAY_CHANGED, - Uri.fromParts("package", targetPackage, null)); - intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - try { - ActivityManager.getService().broadcastIntent(null, intent, null, null, 0, null, null, - null, android.app.AppOpsManager.OP_NONE, null, false, false, userId); - } catch (RemoteException e) { - // Intentionally left empty. - } + CollectionUtils.forEach(targetPackages, target -> { + final Intent intent = new Intent(ACTION_OVERLAY_CHANGED, + Uri.fromParts("package", target, null)); + intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + try { + ActivityManager.getService().broadcastIntent(null, intent, null, null, 0, null, + null, null, android.app.AppOpsManager.OP_NONE, null, false, false, userId); + } catch (RemoteException e) { + Slog.e(TAG, "broadcastActionOverlayChanged remote exception", e); + } + }); } /** @@ -1455,18 +1421,13 @@ public final class OverlayManagerService extends SystemService { try { am.scheduleApplicationInfoChanged(targetPackageNames, userId); } catch (RemoteException e) { - // Intentionally left empty. - } - } - - private void updateActivityManager(@NonNull SparseArray<List<String>> targetPackageNames) { - for (int i = 0, n = targetPackageNames.size(); i < n; i++) { - updateActivityManager(targetPackageNames.valueAt(i), targetPackageNames.keyAt(i)); + Slog.e(TAG, "updateActivityManager remote exception", e); } } @NonNull - private SparseArray<List<String>> updatePackageManager(@Nullable Set<PackageAndUser> targets) { + private SparseArray<List<String>> updatePackageManagerLocked( + @Nullable Set<PackageAndUser> targets) { if (CollectionUtils.isEmpty(targets)) { return new SparseArray<>(); } @@ -1474,7 +1435,7 @@ public final class OverlayManagerService extends SystemService { final SparseArray<ArraySet<String>> userTargets = groupTargetsByUserId(targets); for (int i = 0, n = userTargets.size(); i < n; i++) { final int userId = userTargets.keyAt(i); - affectedTargets.put(userId, updatePackageManager(userTargets.valueAt(i), userId)); + affectedTargets.put(userId, updatePackageManagerLocked(userTargets.valueAt(i), userId)); } return affectedTargets; } @@ -1485,10 +1446,10 @@ public final class OverlayManagerService extends SystemService { * targetPackageNames: the target themselves and shared libraries) */ @NonNull - private List<String> updatePackageManager(@NonNull Collection<String> targetPackageNames, + private List<String> updatePackageManagerLocked(@NonNull Collection<String> targetPackageNames, final int userId) { try { - traceBegin(TRACE_TAG_RRO, "OMS#updatePackageManager " + targetPackageNames); + traceBegin(TRACE_TAG_RRO, "OMS#updatePackageManagerLocked " + targetPackageNames); if (DEBUG) { Slog.d(TAG, "Update package manager about changed overlays"); } @@ -1535,20 +1496,18 @@ public final class OverlayManagerService extends SystemService { } } - private void persistSettings() { + private void persistSettingsLocked() { if (DEBUG) { Slog.d(TAG, "Writing overlay settings"); } - synchronized (mLock) { - FileOutputStream stream = null; - try { - stream = mSettingsFile.startWrite(); - mSettings.persist(stream); - mSettingsFile.finishWrite(stream); - } catch (IOException | XmlPullParserException e) { - mSettingsFile.failWrite(stream); - Slog.e(TAG, "failed to persist overlay state", e); - } + FileOutputStream stream = null; + try { + stream = mSettingsFile.startWrite(); + mSettings.persist(stream); + mSettingsFile.finishWrite(stream); + } catch (IOException | XmlPullParserException e) { + mSettingsFile.failWrite(stream); + Slog.e(TAG, "failed to persist overlay state", e); } } diff --git a/services/core/java/com/android/server/pm/CrossProfileIntentResolver.java b/services/core/java/com/android/server/pm/CrossProfileIntentResolver.java index aae6ce46de66..791a1057d112 100644 --- a/services/core/java/com/android/server/pm/CrossProfileIntentResolver.java +++ b/services/core/java/com/android/server/pm/CrossProfileIntentResolver.java @@ -19,7 +19,7 @@ package com.android.server.pm; import android.annotation.NonNull; import android.content.IntentFilter; -import com.android.server.WatchableIntentResolver; +import com.android.server.WatchedIntentResolver; import com.android.server.utils.Snappable; import java.util.List; @@ -28,7 +28,7 @@ import java.util.List; * Used to find a list of {@link CrossProfileIntentFilter}s that match an intent. */ class CrossProfileIntentResolver - extends WatchableIntentResolver<CrossProfileIntentFilter, CrossProfileIntentFilter> + extends WatchedIntentResolver<CrossProfileIntentFilter, CrossProfileIntentFilter> implements Snappable { @Override protected CrossProfileIntentFilter[] newArray(int size) { diff --git a/services/core/java/com/android/server/pm/PersistentPreferredIntentResolver.java b/services/core/java/com/android/server/pm/PersistentPreferredIntentResolver.java index c1bfcac50772..2b11a4297835 100644 --- a/services/core/java/com/android/server/pm/PersistentPreferredIntentResolver.java +++ b/services/core/java/com/android/server/pm/PersistentPreferredIntentResolver.java @@ -19,11 +19,11 @@ package com.android.server.pm; import android.annotation.NonNull; import android.content.IntentFilter; -import com.android.server.WatchableIntentResolver; +import com.android.server.WatchedIntentResolver; import com.android.server.utils.Snappable; public class PersistentPreferredIntentResolver - extends WatchableIntentResolver<PersistentPreferredActivity, PersistentPreferredActivity> + extends WatchedIntentResolver<PersistentPreferredActivity, PersistentPreferredActivity> implements Snappable { @Override protected PersistentPreferredActivity[] newArray(int size) { diff --git a/services/core/java/com/android/server/pm/PreferredIntentResolver.java b/services/core/java/com/android/server/pm/PreferredIntentResolver.java index 0e3b85ca677a..10a6b3f69fde 100644 --- a/services/core/java/com/android/server/pm/PreferredIntentResolver.java +++ b/services/core/java/com/android/server/pm/PreferredIntentResolver.java @@ -19,14 +19,14 @@ package com.android.server.pm; import android.annotation.NonNull; import android.content.IntentFilter; -import com.android.server.WatchableIntentResolver; +import com.android.server.WatchedIntentResolver; import com.android.server.utils.Snappable; import java.io.PrintWriter; import java.util.ArrayList; public class PreferredIntentResolver - extends WatchableIntentResolver<PreferredActivity, PreferredActivity> + extends WatchedIntentResolver<PreferredActivity, PreferredActivity> implements Snappable { @Override protected PreferredActivity[] newArray(int size) { diff --git a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java index 0c8e36b75425..c8dc1b1ff562 100644 --- a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java +++ b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java @@ -146,47 +146,11 @@ public class ArtStatsLogUtils { uid, compilationReason, compilerFilter, - ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_DEX_CODE_BYTES, - getDexBytes(path), - dexMetadataType); - logger.write( - sessionId, - uid, - compilationReason, - compilerFilter, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_TOTAL_TIME, compileTime, dexMetadataType); } - private static long getDexBytes(String apkPath) { - StrictJarFile jarFile = null; - long dexBytes = 0; - try { - jarFile = new StrictJarFile(apkPath, - /*verify=*/ false, - /*signatureSchemeRollbackProtectionsEnforced=*/ false); - Iterator<ZipEntry> it = jarFile.iterator(); - while (it.hasNext()) { - ZipEntry entry = it.next(); - if (entry.getName().matches("classes(\\d)*[.]dex")) { - dexBytes += entry.getSize(); - } - } - return dexBytes; - } catch (IOException ignore) { - Slog.e(TAG, "Error when parsing APK " + apkPath); - return -1L; - } finally { - try { - if (jarFile != null) { - jarFile.close(); - } - } catch (IOException ignore) { - } - } - } - private static int getDexMetadataType(String dexMetadataPath) { if (dexMetadataPath == null) { return ArtStatsLog.ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_NONE; diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index f0629fa953fc..520bd8b2108e 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -126,7 +126,7 @@ class LocalAnimationAdapter implements AnimationAdapter { /** * @return {@code true} if we need to wake-up SurfaceFlinger earlier during this animation. * - * @see Transaction#setEarlyWakeup + * @see Transaction#setEarlyWakeupStart and Transaction#setEarlyWakeupEnd */ default boolean needsEarlyWakeup() { return false; } diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java index a46a8d56e226..64a26ec69f03 100644 --- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java +++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.os.Build.IS_USER; +import static android.view.CrossWindowBlurListeners.CROSS_WINDOW_BLUR_SUPPORTED; import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND; import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING; @@ -135,6 +136,8 @@ public class WindowManagerShellCommand extends ShellCommand { return runGetLetterboxBackgroundColor(pw); case "reset": return runReset(pw); + case "disable-blur": + return runSetBlurDisabled(pw); default: return handleDefaultCommands(cmd); } @@ -214,6 +217,33 @@ public class WindowManagerShellCommand extends ShellCommand { return 0; } + private int runSetBlurDisabled(PrintWriter pw) throws RemoteException { + String arg = getNextArg(); + if (arg == null) { + pw.println("Blur supported on device: " + CROSS_WINDOW_BLUR_SUPPORTED); + pw.println("Blur enabled: " + mInternal.mBlurController.mBlurEnabled); + return 0; + } + + final boolean disableBlur; + switch (arg) { + case "true": + case "1": + disableBlur = true; + break; + case "false": + case "0": + disableBlur = false; + break; + default: + getErrPrintWriter().println("Error: expected true, 1, false, 0, but got " + arg); + return -1; + } + + mInterface.setForceCrossWindowBlurDisabled(disableBlur); + return 0; + } + private void printInitialDisplayDensity(PrintWriter pw , int displayId) { try { final int initialDensity = mInterface.getInitialDisplayDensity(displayId); @@ -725,6 +755,7 @@ public class WindowManagerShellCommand extends ShellCommand { pw.println(" Set display scaling mode."); pw.println(" dismiss-keyguard"); pw.println(" Dismiss the keyguard, prompting user for auth if necessary."); + pw.println(" disable-blur [true|1|false|0]"); pw.println(" user-rotation [-d DISPLAY_ID] [free|lock] [rotation]"); pw.println(" Print or set user rotation mode and user rotation."); pw.println(" dump-visible-window-views"); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index a8131e4e00ce..283895bb53e2 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -51,6 +51,7 @@ import static android.app.admin.DevicePolicyManager.DELEGATION_KEEP_UNINSTALLED_ import static android.app.admin.DevicePolicyManager.DELEGATION_NETWORK_LOGGING; import static android.app.admin.DevicePolicyManager.DELEGATION_PACKAGE_ACCESS; import static android.app.admin.DevicePolicyManager.DELEGATION_PERMISSION_GRANT; +import static android.app.admin.DevicePolicyManager.DELEGATION_SECURITY_LOGGING; import static android.app.admin.DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER; import static android.app.admin.DevicePolicyManager.ID_TYPE_BASE_INFO; import static android.app.admin.DevicePolicyManager.ID_TYPE_IMEI; @@ -430,6 +431,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { DELEGATION_INSTALL_EXISTING_PACKAGE, DELEGATION_KEEP_UNINSTALLED_PACKAGES, DELEGATION_NETWORK_LOGGING, + DELEGATION_SECURITY_LOGGING, DELEGATION_CERT_SELECTION, }; @@ -440,9 +442,18 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { DELEGATION_NETWORK_LOGGING, }); + // Subset of delegations that can only be delegated by Device Owner or Profile Owner of an + // organization-owned and managed profile. + private static final List<String> + DEVICE_OWNER_OR_ORGANIZATION_OWNED_MANAGED_PROFILE_OWNER_DELEGATIONS = + Arrays.asList(new String[]{ + DELEGATION_SECURITY_LOGGING, + }); + // Subset of delegations that only one single package within a given user can hold private static final List<String> EXCLUSIVE_DELEGATIONS = Arrays.asList(new String[] { DELEGATION_NETWORK_LOGGING, + DELEGATION_SECURITY_LOGGING, DELEGATION_CERT_SELECTION, }); @@ -6024,6 +6035,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (!Collections.disjoint(scopes, DEVICE_OWNER_OR_MANAGED_PROFILE_OWNER_DELEGATIONS)) { Preconditions.checkCallAuthorization(isDeviceOwner(caller) || (isProfileOwner(caller) && isManagedProfile(caller.getUserId()))); + } else if (!Collections.disjoint( + scopes, DEVICE_OWNER_OR_ORGANIZATION_OWNED_MANAGED_PROFILE_OWNER_DELEGATIONS)) { + Preconditions.checkCallAuthorization(isDeviceOwner(caller) + || isProfileOwnerOfOrganizationOwnedDevice(caller)); } else { Preconditions.checkCallAuthorization(isDeviceOwner(caller) || isProfileOwner(caller)); } @@ -7658,6 +7673,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { receiverComponent = resolveDelegateReceiver(DELEGATION_NETWORK_LOGGING, action, deviceOwnerUserId); } + if (action.equals(DeviceAdminReceiver.ACTION_SECURITY_LOGS_AVAILABLE)) { + receiverComponent = resolveDelegateReceiver(DELEGATION_SECURITY_LOGGING, action, + deviceOwnerUserId); + } if (receiverComponent == null) { synchronized (getLockObject()) { receiverComponent = mOwners.getDeviceOwnerComponent(); @@ -7674,6 +7693,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (action.equals(DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE)) { receiverComponent = resolveDelegateReceiver(DELEGATION_NETWORK_LOGGING, action, userId); } + if (action.equals(DeviceAdminReceiver.ACTION_SECURITY_LOGS_AVAILABLE)) { + receiverComponent = resolveDelegateReceiver( + DELEGATION_SECURITY_LOGGING, action, userId); + } if (receiverComponent == null) { receiverComponent = getOwnerComponent(userId); } @@ -13920,16 +13943,24 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @Override - public void setSecurityLoggingEnabled(ComponentName admin, boolean enabled) { + public void setSecurityLoggingEnabled(ComponentName admin, String packageName, + boolean enabled) { if (!mHasFeature) { return; } - Objects.requireNonNull(admin); - final CallerIdentity caller = getCallerIdentity(admin); + final CallerIdentity caller = getCallerIdentity(admin, packageName); synchronized (getLockObject()) { - Preconditions.checkCallAuthorization(isProfileOwnerOfOrganizationOwnedDevice(caller) - || isDeviceOwner(caller)); + if (admin != null) { + Preconditions.checkCallAuthorization( + isProfileOwnerOfOrganizationOwnedDevice(caller) + || isDeviceOwner(caller)); + } else { + // A delegate app passes a null admin component, which is expected + Preconditions.checkCallAuthorization( + isCallerDelegate(caller, DELEGATION_SECURITY_LOGGING)); + } + if (enabled == mInjector.securityLogGetLoggingEnabledProperty()) { return; } @@ -13949,17 +13980,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @Override - public boolean isSecurityLoggingEnabled(ComponentName admin) { + public boolean isSecurityLoggingEnabled(ComponentName admin, String packageName) { if (!mHasFeature) { return false; } synchronized (getLockObject()) { if (!isCallerWithSystemUid()) { - Objects.requireNonNull(admin); - final CallerIdentity caller = getCallerIdentity(admin); - Preconditions.checkCallAuthorization( - isProfileOwnerOfOrganizationOwnedDevice(caller) || isDeviceOwner(caller)); + final CallerIdentity caller = getCallerIdentity(admin, packageName); + if (admin != null) { + Preconditions.checkCallAuthorization( + isProfileOwnerOfOrganizationOwnedDevice(caller) + || isDeviceOwner(caller)); + } else { + // A delegate app passes a null admin component, which is expected + Preconditions.checkCallAuthorization( + isCallerDelegate(caller, DELEGATION_SECURITY_LOGGING)); + } } return mInjector.securityLogGetLoggingEnabledProperty(); } @@ -13977,15 +14014,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @Override - public ParceledListSlice<SecurityEvent> retrievePreRebootSecurityLogs(ComponentName admin) { + public ParceledListSlice<SecurityEvent> retrievePreRebootSecurityLogs(ComponentName admin, + String packageName) { if (!mHasFeature) { return null; } - Objects.requireNonNull(admin, "ComponentName is null"); - final CallerIdentity caller = getCallerIdentity(admin); - Preconditions.checkCallAuthorization(isDeviceOwner(caller) - || isProfileOwnerOfOrganizationOwnedDevice(caller)); + final CallerIdentity caller = getCallerIdentity(admin, packageName); + if (admin != null) { + Preconditions.checkCallAuthorization( + isProfileOwnerOfOrganizationOwnedDevice(caller) + || isDeviceOwner(caller)); + } else { + // A delegate app passes a null admin component, which is expected + Preconditions.checkCallAuthorization( + isCallerDelegate(caller, DELEGATION_SECURITY_LOGGING)); + } + Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile() || areAllUsersAffiliatedWithDeviceLocked()); @@ -14015,15 +14060,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @Override - public ParceledListSlice<SecurityEvent> retrieveSecurityLogs(ComponentName admin) { + public ParceledListSlice<SecurityEvent> retrieveSecurityLogs(ComponentName admin, + String packageName) { if (!mHasFeature) { return null; } - Objects.requireNonNull(admin, "ComponentName is null"); - final CallerIdentity caller = getCallerIdentity(admin); - Preconditions.checkCallAuthorization(isDeviceOwner(caller) - || isProfileOwnerOfOrganizationOwnedDevice(caller)); + final CallerIdentity caller = getCallerIdentity(admin, packageName); + if (admin != null) { + Preconditions.checkCallAuthorization( + isProfileOwnerOfOrganizationOwnedDevice(caller) + || isDeviceOwner(caller)); + } else { + // A delegate app passes a null admin component, which is expected + Preconditions.checkCallAuthorization( + isCallerDelegate(caller, DELEGATION_SECURITY_LOGGING)); + } Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile() || areAllUsersAffiliatedWithDeviceLocked()); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java index 281c1aafe049..f73af535f452 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java @@ -52,6 +52,7 @@ import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import android.Manifest; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AlarmManager; @@ -66,7 +67,10 @@ import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.ServiceInfo; import android.os.BatteryManager; @@ -142,6 +146,8 @@ public class QuotaControllerTest { @Mock private JobSchedulerService mJobSchedulerService; @Mock + private PackageManager mPackageManager; + @Mock private PackageManagerInternal mPackageManagerInternal; @Mock private PowerAllowlistInternal mPowerAllowlistInternal; @@ -201,6 +207,8 @@ public class QuotaControllerTest { -> mDeviceConfigPropertiesBuilder.build()) .when(() -> DeviceConfig.getProperties( eq(DeviceConfig.NAMESPACE_JOB_SCHEDULER), ArgumentMatchers.<String>any())); + // Used in QuotaController.onSystemServicesReady + when(mContext.getPackageManager()).thenReturn(mPackageManager); // Freeze the clocks at 24 hours after this moment in time. Several tests create sessions // in the past, and QuotaController sometimes floors values at 0, so if the test time @@ -2704,7 +2712,8 @@ public class QuotaControllerTest { setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_FREQUENT_MS, 1 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_RARE_MS, 30 * MINUTE_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_RESTRICTED_MS, 27 * MINUTE_IN_MILLIS); - setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_SPECIAL_ADDITION_MS, 10 * HOUR_IN_MILLIS); + setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_ADDITION_INSTALLER_MS, 7 * HOUR_IN_MILLIS); + setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_ADDITION_SPECIAL_MS, 10 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_WINDOW_SIZE_MS, 12 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_TOP_APP_TIME_CHUNK_SIZE_MS, 10 * MINUTE_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_REWARD_TOP_APP_MS, 87 * SECOND_IN_MILLIS); @@ -2745,7 +2754,8 @@ public class QuotaControllerTest { assertEquals(HOUR_IN_MILLIS, mQuotaController.getEJLimitsMs()[FREQUENT_INDEX]); assertEquals(30 * MINUTE_IN_MILLIS, mQuotaController.getEJLimitsMs()[RARE_INDEX]); assertEquals(27 * MINUTE_IN_MILLIS, mQuotaController.getEJLimitsMs()[RESTRICTED_INDEX]); - assertEquals(10 * HOUR_IN_MILLIS, mQuotaController.getEjLimitSpecialAdditionMs()); + assertEquals(7 * HOUR_IN_MILLIS, mQuotaController.getEjLimitAdditionInstallerMs()); + assertEquals(10 * HOUR_IN_MILLIS, mQuotaController.getEjLimitAdditionSpecialMs()); assertEquals(12 * HOUR_IN_MILLIS, mQuotaController.getEJLimitWindowSizeMs()); assertEquals(10 * MINUTE_IN_MILLIS, mQuotaController.getEJTopAppTimeChunkSizeMs()); assertEquals(87 * SECOND_IN_MILLIS, mQuotaController.getEJRewardTopAppMs()); @@ -2786,7 +2796,8 @@ public class QuotaControllerTest { setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_FREQUENT_MS, -1); setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_RARE_MS, -1); setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_RESTRICTED_MS, -1); - setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_SPECIAL_ADDITION_MS, -1); + setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_ADDITION_INSTALLER_MS, -1); + setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_ADDITION_SPECIAL_MS, -1); setDeviceConfigLong(QcConstants.KEY_EJ_WINDOW_SIZE_MS, -1); setDeviceConfigLong(QcConstants.KEY_EJ_TOP_APP_TIME_CHUNK_SIZE_MS, -1); setDeviceConfigLong(QcConstants.KEY_EJ_REWARD_TOP_APP_MS, -1); @@ -2823,7 +2834,8 @@ public class QuotaControllerTest { assertEquals(10 * MINUTE_IN_MILLIS, mQuotaController.getEJLimitsMs()[FREQUENT_INDEX]); assertEquals(10 * MINUTE_IN_MILLIS, mQuotaController.getEJLimitsMs()[RARE_INDEX]); assertEquals(5 * MINUTE_IN_MILLIS, mQuotaController.getEJLimitsMs()[RESTRICTED_INDEX]); - assertEquals(0, mQuotaController.getEjLimitSpecialAdditionMs()); + assertEquals(0, mQuotaController.getEjLimitAdditionInstallerMs()); + assertEquals(0, mQuotaController.getEjLimitAdditionSpecialMs()); assertEquals(HOUR_IN_MILLIS, mQuotaController.getEJLimitWindowSizeMs()); assertEquals(1, mQuotaController.getEJTopAppTimeChunkSizeMs()); assertEquals(10 * SECOND_IN_MILLIS, mQuotaController.getEJRewardTopAppMs()); @@ -2858,7 +2870,8 @@ public class QuotaControllerTest { setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_FREQUENT_MS, 25 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_RARE_MS, 25 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_RESTRICTED_MS, 25 * HOUR_IN_MILLIS); - setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_SPECIAL_ADDITION_MS, 25 * HOUR_IN_MILLIS); + setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_ADDITION_INSTALLER_MS, 25 * HOUR_IN_MILLIS); + setDeviceConfigLong(QcConstants.KEY_EJ_LIMIT_ADDITION_SPECIAL_MS, 25 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_WINDOW_SIZE_MS, 25 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_TOP_APP_TIME_CHUNK_SIZE_MS, 25 * HOUR_IN_MILLIS); setDeviceConfigLong(QcConstants.KEY_EJ_REWARD_TOP_APP_MS, 25 * HOUR_IN_MILLIS); @@ -2885,7 +2898,8 @@ public class QuotaControllerTest { assertEquals(24 * HOUR_IN_MILLIS, mQuotaController.getEJLimitsMs()[FREQUENT_INDEX]); assertEquals(24 * HOUR_IN_MILLIS, mQuotaController.getEJLimitsMs()[RARE_INDEX]); assertEquals(24 * HOUR_IN_MILLIS, mQuotaController.getEJLimitsMs()[RESTRICTED_INDEX]); - assertEquals(0, mQuotaController.getEjLimitSpecialAdditionMs()); + assertEquals(0, mQuotaController.getEjLimitAdditionInstallerMs()); + assertEquals(0, mQuotaController.getEjLimitAdditionSpecialMs()); assertEquals(24 * HOUR_IN_MILLIS, mQuotaController.getEJLimitWindowSizeMs()); assertEquals(15 * MINUTE_IN_MILLIS, mQuotaController.getEJTopAppTimeChunkSizeMs()); assertEquals(15 * MINUTE_IN_MILLIS, mQuotaController.getEJRewardTopAppMs()); @@ -3957,9 +3971,16 @@ public class QuotaControllerTest { } @Test - public void testGetRemainingEJExecutionTimeLocked_SpecialApp() { - doReturn(new String[]{SOURCE_PACKAGE}).when(mPackageManagerInternal) - .getKnownPackageNames(eq(PackageManagerInternal.PACKAGE_VERIFIER), anyInt()); + public void testGetRemainingEJExecutionTimeLocked_Installer() { + PackageInfo pi = new PackageInfo(); + pi.packageName = SOURCE_PACKAGE; + pi.requestedPermissions = new String[]{Manifest.permission.INSTALL_PACKAGES}; + pi.requestedPermissionsFlags = new int[]{PackageInfo.REQUESTED_PERMISSION_GRANTED}; + pi.applicationInfo = new ApplicationInfo(); + pi.applicationInfo.uid = mSourceUid; + doReturn(List.of(pi)).when(mPackageManager).getInstalledPackagesAsUser(anyInt(), anyInt()); + doReturn(PackageManager.PERMISSION_GRANTED).when(mContext).checkPermission( + eq(Manifest.permission.INSTALL_PACKAGES), anyInt(), eq(mSourceUid)); mQuotaController.onSystemServicesReady(); final long now = JobSchedulerService.sElapsedRealtimeClock.millis(); @@ -3980,7 +4001,7 @@ public class QuotaControllerTest { setStandbyBucket(i); assertEquals("Got wrong remaining EJ execution time for bucket #" + i, i == NEVER_INDEX ? 0 - : (limits[i] + mQuotaController.getEjLimitSpecialAdditionMs() + : (limits[i] + mQuotaController.getEjLimitAdditionInstallerMs() - 5 * MINUTE_IN_MILLIS), mQuotaController.getRemainingEJExecutionTimeLocked( SOURCE_USER_ID, SOURCE_PACKAGE)); diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/dex/OWNERS b/services/tests/mockingservicestests/src/com/android/server/pm/dex/OWNERS index 5a4431ee8c89..5492dc8e37a3 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/dex/OWNERS +++ b/services/tests/mockingservicestests/src/com/android/server/pm/dex/OWNERS @@ -1,2 +1 @@ -calin@google.com -ngeoffray@google.com +include platform/art:/OWNERS
\ No newline at end of file diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java index a6d146e7ef71..3cbc22654292 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java @@ -151,7 +151,8 @@ public class AuthSessionTest { eq(userId), eq(mSensorReceiver), eq(TEST_PACKAGE), - eq(sensor.getCookie())); + eq(sensor.getCookie()), + anyBoolean() /* allowBackgroundAuthentication */); } final int cookie1 = session.mPreAuthInfo.eligibleSensors.get(0).getCookie(); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java index 0c95e05342c8..abc873766de1 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java @@ -456,7 +456,8 @@ public class BiometricServiceTest { anyInt() /* userId */, any(IBiometricSensorReceiver.class), anyString() /* opPackageName */, - cookieCaptor.capture() /* cookie */); + cookieCaptor.capture() /* cookie */, + anyBoolean() /* allowBackgroundAuthentication */); // onReadyForAuthentication, mCurrentAuthSession state OK mBiometricService.mImpl.onReadyForAuthentication(cookieCaptor.getValue()); diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java index bc86d1d39b1c..429517251f67 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -93,7 +93,9 @@ public class DisplayManagerServiceTest { private static final long SHORT_DEFAULT_DISPLAY_TIMEOUT_MILLIS = 10; private static final String VIRTUAL_DISPLAY_NAME = "Test Virtual Display"; private static final String PACKAGE_NAME = "com.android.frameworks.servicestests"; - + private static final long ALL_DISPLAY_EVENTS = DisplayManager.EVENT_FLAG_DISPLAY_ADDED + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED + | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED; @Rule public TestRule compatChangeRule = new PlatformCompatChangeRule(); @@ -355,29 +357,13 @@ public class DisplayManagerServiceTest { // Find the display id of the added FakeDisplayDevice DisplayManagerService.BinderService bs = displayManager.new BinderService(); - final int[] displayIds = bs.getDisplayIds(); - assertTrue(displayIds.length > 0); - int displayId = Display.INVALID_DISPLAY; - for (int i = 0; i < displayIds.length; i++) { - DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayIds[i]); - if (displayDeviceInfo.equals(ddi)) { - displayId = displayIds[i]; - break; - } - } - assertFalse(displayId == Display.INVALID_DISPLAY); - + int displayId = getDisplayIdForDisplayDevice(displayManager, bs, displayDevice); // Setup override DisplayInfo DisplayInfo overrideInfo = bs.getDisplayInfo(displayId); displayManager.setDisplayInfoOverrideFromWindowManagerInternal(displayId, overrideInfo); - Handler handler = displayManager.getDisplayHandler(); - handler.runWithScissors(() -> { - }, 0 /* now */); - - // register display listener callback - FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback(displayId); - bs.registerCallback(callback); + FakeDisplayManagerCallback callback = registerDisplayListenerCallback( + displayManager, bs, displayDevice); // Simulate DisplayDevice change DisplayDeviceInfo displayDeviceInfo2 = new DisplayDeviceInfo(); @@ -387,9 +373,9 @@ public class DisplayManagerServiceTest { displayManager.getDisplayDeviceRepository() .onDisplayDeviceEvent(displayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_CHANGED); - handler.runWithScissors(() -> { - }, 0 /* now */); - assertTrue(callback.mCalled); + Handler handler = displayManager.getDisplayHandler(); + waitForIdleHandler(handler); + assertTrue(callback.mDisplayChangedCalled); } /** @@ -400,7 +386,7 @@ public class DisplayManagerServiceTest { DisplayManagerService displayManager = new DisplayManagerService(mContext, mShortMockedInjector); Handler handler = displayManager.getDisplayHandler(); - handler.runWithScissors(() -> {}, 0 /* now */); + waitForIdleHandler(handler); try { displayManager.onBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); @@ -616,7 +602,7 @@ public class DisplayManagerServiceTest { } /** - * Tests that there should be a display change notification if the frame rate overrides + * Tests that there is a display change notification if the frame rate override * list is updated. */ @Test @@ -637,7 +623,7 @@ public class DisplayManagerServiceTest { new DisplayEventReceiver.FrameRateOverride[]{ new DisplayEventReceiver.FrameRateOverride(myUid, 30f), }); - assertTrue(callback.mCalled); + assertTrue(callback.mDisplayChangedCalled); callback.clear(); updateFrameRateOverride(displayManager, displayDevice, @@ -645,7 +631,7 @@ public class DisplayManagerServiceTest { new DisplayEventReceiver.FrameRateOverride(myUid, 30f), new DisplayEventReceiver.FrameRateOverride(1234, 30f), }); - assertFalse(callback.mCalled); + assertFalse(callback.mDisplayChangedCalled); updateFrameRateOverride(displayManager, displayDevice, new DisplayEventReceiver.FrameRateOverride[]{ @@ -653,7 +639,7 @@ public class DisplayManagerServiceTest { new DisplayEventReceiver.FrameRateOverride(1234, 30f), new DisplayEventReceiver.FrameRateOverride(5678, 30f), }); - assertTrue(callback.mCalled); + assertTrue(callback.mDisplayChangedCalled); callback.clear(); updateFrameRateOverride(displayManager, displayDevice, @@ -661,14 +647,14 @@ public class DisplayManagerServiceTest { new DisplayEventReceiver.FrameRateOverride(1234, 30f), new DisplayEventReceiver.FrameRateOverride(5678, 30f), }); - assertTrue(callback.mCalled); + assertTrue(callback.mDisplayChangedCalled); callback.clear(); updateFrameRateOverride(displayManager, displayDevice, new DisplayEventReceiver.FrameRateOverride[]{ new DisplayEventReceiver.FrameRateOverride(5678, 30f), }); - assertFalse(callback.mCalled); + assertFalse(callback.mDisplayChangedCalled); } /** @@ -760,6 +746,136 @@ public class DisplayManagerServiceTest { /*compatChangeEnabled*/ true); } + /** + * Tests that EVENT_DISPLAY_ADDED is sent when a display is added. + */ + @Test + public void testShouldNotifyDisplayAdded_WhenNewDisplayDeviceIsAdded() { + DisplayManagerService displayManager = + new DisplayManagerService(mContext, mShortMockedInjector); + DisplayManagerService.BinderService displayManagerBinderService = + displayManager.new BinderService(); + + Handler handler = displayManager.getDisplayHandler(); + waitForIdleHandler(handler); + + // register display listener callback + FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback(); + displayManagerBinderService.registerCallbackWithEventMask(callback, ALL_DISPLAY_EVENTS); + + waitForIdleHandler(handler); + + createFakeDisplayDevice(displayManager, new float[]{60f}); + + waitForIdleHandler(handler); + + assertFalse(callback.mDisplayChangedCalled); + assertFalse(callback.mDisplayRemovedCalled); + assertTrue(callback.mDisplayAddedCalled); + } + + /** + * Tests that EVENT_DISPLAY_ADDED is not sent when a display is added and the + * client has a callback which is not subscribed to this event type. + */ + @Test + public void testShouldNotNotifyDisplayAdded_WhenClientIsNotSubscribed() { + DisplayManagerService displayManager = + new DisplayManagerService(mContext, mShortMockedInjector); + DisplayManagerService.BinderService displayManagerBinderService = + displayManager.new BinderService(); + + Handler handler = displayManager.getDisplayHandler(); + waitForIdleHandler(handler); + + // register display listener callback + FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback(); + long allEventsExceptDisplayAdded = ALL_DISPLAY_EVENTS + & ~DisplayManager.EVENT_FLAG_DISPLAY_ADDED; + displayManagerBinderService.registerCallbackWithEventMask(callback, + allEventsExceptDisplayAdded); + + waitForIdleHandler(handler); + + createFakeDisplayDevice(displayManager, new float[]{60f}); + + waitForIdleHandler(handler); + + assertFalse(callback.mDisplayChangedCalled); + assertFalse(callback.mDisplayRemovedCalled); + assertFalse(callback.mDisplayAddedCalled); + } + + /** + * Tests that EVENT_DISPLAY_REMOVED is sent when a display is removed. + */ + @Test + public void testShouldNotifyDisplayRemoved_WhenDisplayDeviceIsRemoved() { + DisplayManagerService displayManager = + new DisplayManagerService(mContext, mShortMockedInjector); + DisplayManagerService.BinderService displayManagerBinderService = + displayManager.new BinderService(); + + Handler handler = displayManager.getDisplayHandler(); + waitForIdleHandler(handler); + + FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, + new float[]{60f}); + + waitForIdleHandler(handler); + + FakeDisplayManagerCallback callback = registerDisplayListenerCallback( + displayManager, displayManagerBinderService, displayDevice); + + waitForIdleHandler(handler); + + displayManager.getDisplayDeviceRepository() + .onDisplayDeviceEvent(displayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED); + + waitForIdleHandler(handler); + + assertFalse(callback.mDisplayChangedCalled); + assertTrue(callback.mDisplayRemovedCalled); + assertFalse(callback.mDisplayAddedCalled); + } + + /** + * Tests that EVENT_DISPLAY_REMOVED is not sent when a display is added and the + * client has a callback which is not subscribed to this event type. + */ + @Test + public void testShouldNotNotifyDisplayRemoved_WhenClientIsNotSubscribed() { + DisplayManagerService displayManager = + new DisplayManagerService(mContext, mShortMockedInjector); + DisplayManagerService.BinderService displayManagerBinderService = + displayManager.new BinderService(); + + Handler handler = displayManager.getDisplayHandler(); + waitForIdleHandler(handler); + + FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, + new float[]{60f}); + + waitForIdleHandler(handler); + + FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback(); + long allEventsExceptDisplayRemoved = ALL_DISPLAY_EVENTS + & ~DisplayManager.EVENT_FLAG_DISPLAY_REMOVED; + displayManagerBinderService.registerCallbackWithEventMask(callback, + allEventsExceptDisplayRemoved); + + waitForIdleHandler(handler); + + displayManager.getDisplayDeviceRepository() + .onDisplayDeviceEvent(displayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED); + + waitForIdleHandler(handler); + + assertFalse(callback.mDisplayChangedCalled); + assertFalse(callback.mDisplayRemovedCalled); + assertFalse(callback.mDisplayAddedCalled); + } + private void testDisplayInfoFrameRateOverrideModeCompat(boolean compatChangeEnabled) throws Exception { DisplayManagerService displayManager = @@ -879,8 +995,7 @@ public class DisplayManagerServiceTest { displayManager.getDisplayDeviceRepository() .onDisplayDeviceEvent(displayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_CHANGED); Handler handler = displayManager.getDisplayHandler(); - handler.runWithScissors(() -> { - }, 0 /* now */); + waitForIdleHandler(handler); } private void updateFrameRateOverride(DisplayManagerService displayManager, @@ -906,18 +1021,15 @@ public class DisplayManagerServiceTest { DisplayManagerService.BinderService displayManagerBinderService, FakeDisplayDevice displayDevice) { // Find the display id of the added FakeDisplayDevice - DisplayDeviceInfo displayDeviceInfo = displayDevice.getDisplayDeviceInfoLocked(); - int displayId = getDisplayIdForDisplayDevice(displayManager, displayManagerBinderService, displayDevice); Handler handler = displayManager.getDisplayHandler(); - handler.runWithScissors(() -> { - }, 0 /* now */); + waitForIdleHandler(handler); // register display listener callback FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback(displayId); - displayManagerBinderService.registerCallback(callback); + displayManagerBinderService.registerCallbackWithEventMask(callback, ALL_DISPLAY_EVENTS); return callback; } @@ -951,6 +1063,10 @@ public class DisplayManagerServiceTest { // Would prefer to call displayManager.onStart() directly here but it performs binderService // registration which triggers security exceptions when running from a test. handler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTERS); + waitForIdleHandler(handler); + } + + private void waitForIdleHandler(Handler handler) { waitForIdleHandler(handler, Duration.ofSeconds(1)); } @@ -971,21 +1087,41 @@ public class DisplayManagerServiceTest { private class FakeDisplayManagerCallback extends IDisplayManagerCallback.Stub { int mDisplayId; - boolean mCalled = false; + boolean mDisplayAddedCalled = false; + boolean mDisplayChangedCalled = false; + boolean mDisplayRemovedCalled = false; FakeDisplayManagerCallback(int displayId) { mDisplayId = displayId; } + FakeDisplayManagerCallback() { + mDisplayId = -1; + } + @Override public void onDisplayEvent(int displayId, int event) { - if (displayId == mDisplayId && event == DisplayManagerGlobal.EVENT_DISPLAY_CHANGED) { - mCalled = true; + if (mDisplayId != -1 && displayId != mDisplayId) { + return; + } + + if (event == DisplayManagerGlobal.EVENT_DISPLAY_ADDED) { + mDisplayAddedCalled = true; + } + + if (event == DisplayManagerGlobal.EVENT_DISPLAY_CHANGED) { + mDisplayChangedCalled = true; + } + + if (event == DisplayManagerGlobal.EVENT_DISPLAY_REMOVED) { + mDisplayRemovedCalled = true; } } public void clear() { - mCalled = false; + mDisplayAddedCalled = false; + mDisplayChangedCalled = false; + mDisplayRemovedCalled = false; } } diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java index 55cd772ad7e0..94e67d16acab 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java +++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java @@ -23,15 +23,14 @@ import static org.junit.Assert.assertTrue; import android.content.om.OverlayIdentifier; import android.content.om.OverlayInfo; -import android.util.ArraySet; import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Arrays; -import java.util.function.BiConsumer; +import java.util.Set; +import java.util.function.Consumer; @RunWith(AndroidJUnit4.class) public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceImplTestsBase { @@ -45,51 +44,47 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI private static final OverlayIdentifier IDENTIFIER2 = new OverlayIdentifier(OVERLAY2); @Test - public void testUpdateOverlaysForUser() { + public void alwaysInitializeAllPackages() { final OverlayManagerServiceImpl impl = getImpl(); final String otherTarget = "some.other.target"; addPackage(target(TARGET), USER); addPackage(target(otherTarget), USER); addPackage(overlay(OVERLAY, TARGET), USER); - // do nothing, expect no change - final ArraySet<PackageAndUser> a = impl.updateOverlaysForUser(USER); - assertEquals(3, a.size()); - assertTrue(a.containsAll(Arrays.asList( - new PackageAndUser(TARGET, USER), - new PackageAndUser(otherTarget, USER), - new PackageAndUser(OVERLAY, USER)))); - - final ArraySet<PackageAndUser> b = impl.updateOverlaysForUser(USER); - assertEquals(3, b.size()); - assertTrue(b.containsAll(Arrays.asList( - new PackageAndUser(TARGET, USER), - new PackageAndUser(otherTarget, USER), - new PackageAndUser(OVERLAY, USER)))); + final Set<PackageAndUser> allPackages = + Set.of(new PackageAndUser(TARGET, USER), + new PackageAndUser(otherTarget, USER), + new PackageAndUser(OVERLAY, USER)); + + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); } @Test - public void testImmutableEnabledChange() throws Exception { + public void testImmutableEnabledChange() { final OverlayManagerServiceImpl impl = getImpl(); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET), USER); + addPackage(target(TARGET), USER); + addPackage(overlay(OVERLAY, TARGET), USER); - configureSystemOverlay(OVERLAY, false /* mutable */, false /* enabled */, 0 /* priority */); - impl.updateOverlaysForUser(USER); + final Set<PackageAndUser> allPackages = + Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER)); + + configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_DISABLED, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o1); assertFalse(o1.isEnabled()); assertFalse(o1.isMutable); - configureSystemOverlay(OVERLAY, false /* mutable */, true /* enabled */, 0 /* priority */); - impl.updateOverlaysForUser(USER); + configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_ENABLED, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o2 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o2); assertTrue(o2.isEnabled()); assertFalse(o2.isMutable); - configureSystemOverlay(OVERLAY, false /* mutable */, false /* enabled */, 0 /* priority */); - impl.updateOverlaysForUser(USER); + configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_DISABLED, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o3); assertFalse(o3.isEnabled()); @@ -97,27 +92,30 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI } @Test - public void testMutableEnabledChangeHasNoEffect() throws Exception { + public void testMutableEnabledChangeHasNoEffect() { final OverlayManagerServiceImpl impl = getImpl(); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET), USER); - configureSystemOverlay(OVERLAY, true /* mutable */, false /* enabled */, 0 /* priority */); + addPackage(target(TARGET), USER); + addPackage(overlay(OVERLAY, TARGET), USER); + configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */); + + final Set<PackageAndUser> allPackages = + Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER)); - impl.updateOverlaysForUser(USER); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o1); assertFalse(o1.isEnabled()); assertTrue(o1.isMutable); - configureSystemOverlay(OVERLAY, true /* mutable */, true /* enabled */, 0 /* priority */); - impl.updateOverlaysForUser(USER); + configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_ENABLED, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o2 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o2); assertFalse(o2.isEnabled()); assertTrue(o2.isMutable); - configureSystemOverlay(OVERLAY, true /* mutable */, false /* enabled */, 0 /* priority */); - impl.updateOverlaysForUser(USER); + configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o3); assertFalse(o3.isEnabled()); @@ -125,59 +123,68 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI } @Test - public void testMutableEnabledToImmutableEnabled() throws Exception { + public void testMutableEnabledToImmutableEnabled() { final OverlayManagerServiceImpl impl = getImpl(); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET), USER); + addPackage(target(TARGET), USER); + addPackage(overlay(OVERLAY, TARGET), USER); - final BiConsumer<Boolean, Boolean> setOverlay = (mutable, enabled) -> { - configureSystemOverlay(OVERLAY, mutable, enabled, 0 /* priority */); - impl.updateOverlaysForUser(USER); + final Set<PackageAndUser> allPackages = + Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER)); + + final Consumer<ConfigState> setOverlay = (state -> { + configureSystemOverlay(OVERLAY, state, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o); - assertEquals(enabled, o.isEnabled()); - assertEquals(mutable, o.isMutable); - }; + assertEquals(o.isEnabled(), state == ConfigState.IMMUTABLE_ENABLED + || state == ConfigState.MUTABLE_ENABLED); + assertEquals(o.isMutable, state == ConfigState.MUTABLE_DISABLED + || state == ConfigState.MUTABLE_ENABLED); + }); // Immutable/enabled -> mutable/enabled - setOverlay.accept(false /* mutable */, true /* enabled */); - setOverlay.accept(true /* mutable */, true /* enabled */); + setOverlay.accept(ConfigState.IMMUTABLE_ENABLED); + setOverlay.accept(ConfigState.MUTABLE_ENABLED); // Mutable/enabled -> immutable/enabled - setOverlay.accept(false /* mutable */, true /* enabled */); + setOverlay.accept(ConfigState.IMMUTABLE_ENABLED); // Immutable/enabled -> mutable/disabled - setOverlay.accept(true /* mutable */, false /* enabled */); + setOverlay.accept(ConfigState.MUTABLE_DISABLED); // Mutable/disabled -> immutable/enabled - setOverlay.accept(false /* mutable */, true /* enabled */); + setOverlay.accept(ConfigState.IMMUTABLE_ENABLED); // Immutable/enabled -> immutable/disabled - setOverlay.accept(false /* mutable */, false /* enabled */); + setOverlay.accept(ConfigState.IMMUTABLE_DISABLED); // Immutable/disabled -> mutable/enabled - setOverlay.accept(true /* mutable */, true /* enabled */); + setOverlay.accept(ConfigState.MUTABLE_ENABLED); // Mutable/enabled -> immutable/disabled - setOverlay.accept(false /* mutable */, false /* enabled */); + setOverlay.accept(ConfigState.IMMUTABLE_DISABLED); // Immutable/disabled -> mutable/disabled - setOverlay.accept(true /* mutable */, false /* enabled */); + setOverlay.accept(ConfigState.MUTABLE_DISABLED); // Mutable/disabled -> immutable/disabled - setOverlay.accept(false /* mutable */, false /* enabled */); + setOverlay.accept(ConfigState.IMMUTABLE_DISABLED); } @Test public void testMutablePriorityChange() throws Exception { final OverlayManagerServiceImpl impl = getImpl(); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET), USER); - installPackage(overlay(OVERLAY2, TARGET), USER); - configureSystemOverlay(OVERLAY, true /* mutable */, false /* enabled */, 0 /* priority */); - configureSystemOverlay(OVERLAY2, true /* mutable */, false /* enabled */, 1 /* priority */); - impl.updateOverlaysForUser(USER); + addPackage(target(TARGET), USER); + addPackage(overlay(OVERLAY, TARGET), USER); + addPackage(overlay(OVERLAY2, TARGET), USER); + configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */); + configureSystemOverlay(OVERLAY2, ConfigState.MUTABLE_DISABLED, 1 /* priority */); + final Set<PackageAndUser> allPackages = + Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER), + new PackageAndUser(OVERLAY2, USER)); + + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o1); assertEquals(0, o1.priority); @@ -193,10 +200,9 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI impl.setEnabled(IDENTIFIER, true, USER); // Reorder the overlays - configureSystemOverlay(OVERLAY, true /* mutable */, false /* enabled */, 1 /* priority */); - configureSystemOverlay(OVERLAY2, true /* mutable */, false /* enabled */, 0 /* priority */); - impl.updateOverlaysForUser(USER); - + configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 1 /* priority */); + configureSystemOverlay(OVERLAY2, ConfigState.MUTABLE_DISABLED, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o3); assertEquals(1, o3.priority); @@ -211,13 +217,17 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI @Test public void testImmutablePriorityChange() throws Exception { final OverlayManagerServiceImpl impl = getImpl(); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET), USER); - installPackage(overlay(OVERLAY2, TARGET), USER); - configureSystemOverlay(OVERLAY, false /* mutable */, true /* enabled */, 0 /* priority */); - configureSystemOverlay(OVERLAY2, false /* mutable */, true /* enabled */, 1 /* priority */); - impl.updateOverlaysForUser(USER); + addPackage(target(TARGET), USER); + addPackage(overlay(OVERLAY, TARGET), USER); + addPackage(overlay(OVERLAY2, TARGET), USER); + configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_ENABLED, 0 /* priority */); + configureSystemOverlay(OVERLAY2, ConfigState.IMMUTABLE_ENABLED, 1 /* priority */); + final Set<PackageAndUser> allPackages = + Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER), + new PackageAndUser(OVERLAY2, USER)); + + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o1); assertEquals(0, o1.priority); @@ -229,10 +239,9 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI assertTrue(o2.isEnabled()); // Reorder the overlays - configureSystemOverlay(OVERLAY, false /* mutable */, true /* enabled */, 1 /* priority */); - configureSystemOverlay(OVERLAY2, false /* mutable */, true /* enabled */, 0 /* priority */); - impl.updateOverlaysForUser(USER); - + configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_ENABLED, 1 /* priority */); + configureSystemOverlay(OVERLAY2, ConfigState.IMMUTABLE_ENABLED, 0 /* priority */); + assertEquals(allPackages, impl.updateOverlaysForUser(USER)); final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER); assertNotNull(o3); assertEquals(1, o3.priority); diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java index 45f82a36c8ed..f69141db0872 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java +++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java @@ -65,7 +65,8 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes @Test public void testGetOverlayInfo() throws Exception { - installPackage(overlay(OVERLAY, TARGET), USER); + installAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); final OverlayManagerServiceImpl impl = getImpl(); final OverlayInfo oi = impl.getOverlayInfo(IDENTIFIER, USER); @@ -77,9 +78,12 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes @Test public void testGetOverlayInfosForTarget() throws Exception { - installPackage(overlay(OVERLAY, TARGET), USER); - installPackage(overlay(OVERLAY2, TARGET), USER); - installPackage(overlay(OVERLAY3, TARGET), USER2); + installAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY2, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY2, USER), new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY3, TARGET), USER2, + Set.of(new PackageAndUser(OVERLAY3, USER2), new PackageAndUser(TARGET, USER2))); final OverlayManagerServiceImpl impl = getImpl(); final List<OverlayInfo> ois = impl.getOverlayInfosForTarget(TARGET, USER); @@ -102,10 +106,14 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes @Test public void testGetOverlayInfosForUser() throws Exception { - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET), USER); - installPackage(overlay(OVERLAY2, TARGET), USER); - installPackage(overlay(OVERLAY3, TARGET2), USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY2, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY2, USER), new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY3, TARGET2), USER, + Set.of(new PackageAndUser(OVERLAY3, USER), new PackageAndUser(TARGET2, USER))); final OverlayManagerServiceImpl impl = getImpl(); final Map<String, List<OverlayInfo>> everything = impl.getOverlaysForUser(USER); @@ -129,9 +137,12 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes @Test public void testPriority() throws Exception { - installPackage(overlay(OVERLAY, TARGET), USER); - installPackage(overlay(OVERLAY2, TARGET), USER); - installPackage(overlay(OVERLAY3, TARGET), USER); + installAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY2, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY2, USER), new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY3, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY3, USER), new PackageAndUser(TARGET, USER))); final OverlayManagerServiceImpl impl = getImpl(); final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER); @@ -158,11 +169,12 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes final OverlayManagerServiceImpl impl = getImpl(); assertNull(impl.getOverlayInfo(IDENTIFIER, USER)); - installPackage(overlay(OVERLAY, TARGET), USER); + installAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); assertState(STATE_MISSING_TARGET, IDENTIFIER, USER); - final FakeDeviceState.PackageBuilder target = target(TARGET); - installPackage(target, USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); assertState(STATE_DISABLED, IDENTIFIER, USER); assertEquals(impl.setEnabled(IDENTIFIER, true, USER), @@ -170,32 +182,35 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes assertState(STATE_ENABLED, IDENTIFIER, USER); // target upgrades do not change the state of the overlay - upgradePackage(target, USER); + upgradeAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER)), + Set.of(new PackageAndUser(TARGET, USER))); assertState(STATE_ENABLED, IDENTIFIER, USER); - uninstallPackage(TARGET, USER); + uninstallAndAssert(TARGET, USER, + Set.of(new PackageAndUser(TARGET, USER))); assertState(STATE_MISSING_TARGET, IDENTIFIER, USER); - installPackage(target, USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); assertState(STATE_ENABLED, IDENTIFIER, USER); } @Test public void testOnOverlayPackageUpgraded() throws Exception { - final FakeDeviceState.PackageBuilder target = target(TARGET); - final FakeDeviceState.PackageBuilder overlay = overlay(OVERLAY, TARGET); - installPackage(target, USER); - installPackage(overlay, USER); - upgradePackage(overlay, USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); + upgradeAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER)), + Set.of(new PackageAndUser(TARGET, USER))); // upgrade to a version where the overlay has changed its target - final FakeDeviceState.PackageBuilder overlay2 = overlay(OVERLAY, "some.other.target"); - final Pair<Set<PackageAndUser>, Set<PackageAndUser>> pair = upgradePackage(overlay2, USER); - assertEquals(pair.first, Set.of(new PackageAndUser(TARGET, USER))); - assertEquals( + upgradeAndAssert(overlay(OVERLAY, TARGET2), USER, + Set.of(new PackageAndUser(TARGET, USER)), Set.of(new PackageAndUser(TARGET, USER), - new PackageAndUser("some.other.target", USER)), - pair.second); + new PackageAndUser(TARGET2, USER))); } @Test @@ -206,13 +221,15 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes // request succeeded, and there was a change that needs to be // propagated to the rest of the system - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET), USER); - assertEquals(impl.setEnabled(IDENTIFIER, true, USER), + installAndAssert(target(TARGET), USER, Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); + assertEquals(Set.of(new PackageAndUser(TARGET, USER)), + impl.setEnabled(IDENTIFIER, true, USER)); // request succeeded, but nothing changed - assertTrue(impl.setEnabled(IDENTIFIER, true, USER).isEmpty()); + assertEquals(Set.of(), impl.setEnabled(IDENTIFIER, true, USER)); } @Test @@ -221,16 +238,18 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes reinitializeImpl(); addPackage(target(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_OK), USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_OK), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); final FakeIdmapDaemon idmapd = getIdmapd(); final FakeDeviceState state = getState(); - String overlayPath = state.select(OVERLAY, USER).apkPath; + final String overlayPath = state.select(OVERLAY, USER).apkPath; assertTrue(idmapd.idmapExists(overlayPath, USER)); - FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); - assertTrue((CONFIG_SIGNATURE & idmap.policies) == CONFIG_SIGNATURE); + final FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); + assertEquals(CONFIG_SIGNATURE, CONFIG_SIGNATURE & idmap.policies); } @Test @@ -239,45 +258,51 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes reinitializeImpl(); addPackage(target(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); final FakeIdmapDaemon idmapd = getIdmapd(); final FakeDeviceState state = getState(); - String overlayPath = state.select(OVERLAY, USER).apkPath; + final String overlayPath = state.select(OVERLAY, USER).apkPath; assertTrue(idmapd.idmapExists(overlayPath, USER)); - FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); - assertTrue((CONFIG_SIGNATURE & idmap.policies) == 0); + final FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); + assertEquals(0, CONFIG_SIGNATURE & idmap.policies); } @Test public void testConfigSignaturePolicyNoConfig() throws Exception { addPackage(target(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); final FakeIdmapDaemon idmapd = getIdmapd(); final FakeDeviceState state = getState(); - String overlayPath = state.select(OVERLAY, USER).apkPath; + final String overlayPath = state.select(OVERLAY, USER).apkPath; assertTrue(idmapd.idmapExists(overlayPath, USER)); - FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); - assertTrue((CONFIG_SIGNATURE & idmap.policies) == 0); + final FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); + assertEquals(0, CONFIG_SIGNATURE & idmap.policies); } @Test public void testConfigSignaturePolicyNoRefPkg() throws Exception { - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); final FakeIdmapDaemon idmapd = getIdmapd(); final FakeDeviceState state = getState(); - String overlayPath = state.select(OVERLAY, USER).apkPath; + final String overlayPath = state.select(OVERLAY, USER).apkPath; assertTrue(idmapd.idmapExists(overlayPath, USER)); - FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); - assertTrue((CONFIG_SIGNATURE & idmap.policies) == 0); + final FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); + assertEquals(0, CONFIG_SIGNATURE & idmap.policies); } @Test @@ -286,8 +311,10 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes reinitializeImpl(); addPackage(app(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER); - installPackage(target(TARGET), USER); - installPackage(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER); + installAndAssert(target(TARGET), USER, + Set.of(new PackageAndUser(TARGET, USER))); + installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER, + Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER))); final FakeIdmapDaemon idmapd = getIdmapd(); final FakeDeviceState state = getState(); @@ -295,6 +322,6 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes assertTrue(idmapd.idmapExists(overlayPath, USER)); FakeIdmapDaemon.IdmapHeader idmap = idmapd.getIdmap(overlayPath); - assertTrue((CONFIG_SIGNATURE & idmap.policies) == 0); + assertEquals(0, CONFIG_SIGNATURE & idmap.policies); } } diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java index 16e03290b1e4..29ff9f4c282c 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java @@ -139,8 +139,19 @@ class OverlayManagerServiceImplTestsBase { mState.add(pkg, userId); } - void configureSystemOverlay(String packageName, boolean mutable, boolean enabled, + enum ConfigState { + IMMUTABLE_DISABLED, + IMMUTABLE_ENABLED, + MUTABLE_DISABLED, + MUTABLE_ENABLED + } + + void configureSystemOverlay(@NonNull String packageName, @NonNull ConfigState state, int priority) { + final boolean mutable = state == ConfigState.MUTABLE_DISABLED + || state == ConfigState.MUTABLE_ENABLED; + final boolean enabled = state == ConfigState.IMMUTABLE_ENABLED + || state == ConfigState.MUTABLE_ENABLED; when(mOverlayConfig.getPriority(packageName)).thenReturn(priority); when(mOverlayConfig.isEnabled(packageName)).thenReturn(enabled); when(mOverlayConfig.isMutable(packageName)).thenReturn(mutable); @@ -154,13 +165,14 @@ class OverlayManagerServiceImplTestsBase { * * @throws IllegalStateException if the package is currently installed */ - Set<PackageAndUser> installPackage(FakeDeviceState.PackageBuilder pkg, int userId) + void installAndAssert(@NonNull FakeDeviceState.PackageBuilder pkg, int userId, + @NonNull Set<PackageAndUser> onAddedUpdatedPackages) throws OperationFailedException { if (mState.select(pkg.packageName, userId) != null) { throw new IllegalStateException("package " + pkg.packageName + " already installed"); } mState.add(pkg, userId); - return CollectionUtils.emptyIfNull(mImpl.onPackageAdded(pkg.packageName, userId)); + assertEquals(onAddedUpdatedPackages, mImpl.onPackageAdded(pkg.packageName, userId)); } /** @@ -172,25 +184,20 @@ class OverlayManagerServiceImplTestsBase { * {@link android.content.Intent#ACTION_PACKAGE_ADDED} broadcast with the * {@link android.content.Intent#EXTRA_REPLACING} extra. * - * @return the two Optional<PackageAndUser> objects from starting and finishing the upgrade - * * @throws IllegalStateException if the package is not currently installed */ - Pair<Set<PackageAndUser>, Set<PackageAndUser>> upgradePackage( - FakeDeviceState.PackageBuilder pkg, int userId) throws OperationFailedException { + void upgradeAndAssert(FakeDeviceState.PackageBuilder pkg, int userId, + @NonNull Set<PackageAndUser> onReplacingUpdatedPackages, + @NonNull Set<PackageAndUser> onReplacedUpdatedPackages) + throws OperationFailedException { final FakeDeviceState.Package replacedPackage = mState.select(pkg.packageName, userId); if (replacedPackage == null) { throw new IllegalStateException("package " + pkg.packageName + " not installed"); } - final Set<PackageAndUser> updatedPackages1 = - CollectionUtils.emptyIfNull(mImpl.onPackageReplacing(pkg.packageName, userId)); - + assertEquals(onReplacingUpdatedPackages, mImpl.onPackageReplacing(pkg.packageName, userId)); mState.add(pkg, userId); - final Set<PackageAndUser> updatedPackages2 = - CollectionUtils.emptyIfNull(mImpl.onPackageReplaced(pkg.packageName, userId)); - - return Pair.create(updatedPackages1, updatedPackages2); + assertEquals(onReplacedUpdatedPackages, mImpl.onPackageReplaced(pkg.packageName, userId)); } /** @@ -201,13 +208,14 @@ class OverlayManagerServiceImplTestsBase { * * @throws IllegalStateException if the package is not currently installed */ - Set<PackageAndUser> uninstallPackage(String packageName, int userId) { + void uninstallAndAssert(@NonNull String packageName, int userId, + @NonNull Set<PackageAndUser> onRemovedUpdatedPackages) { final FakeDeviceState.Package pkg = mState.select(packageName, userId); if (pkg == null) { - throw new IllegalStateException("package " + packageName+ " not installed"); + throw new IllegalStateException("package " + packageName + " not installed"); } mState.remove(pkg.packageName); - return CollectionUtils.emptyIfNull(mImpl.onPackageRemoved(packageName, userId)); + assertEquals(onRemovedUpdatedPackages, mImpl.onPackageRemoved(pkg.packageName, userId)); } /** Represents the state of packages installed on a fake device. */ diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java index e605d755183f..13d75a77507f 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java @@ -245,14 +245,6 @@ public final class ArtStatsLogUtilsTest { UID, COMPILATION_REASON, COMPILER_FILTER, - ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_DEX_CODE_BYTES, - DEX_CONTENT.length, - dexMetadataType); - inorder.verify(mockLogger).write( - SESSION_ID, - UID, - COMPILATION_REASON, - COMPILER_FILTER, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_TOTAL_TIME, COMPILE_TIME, dexMetadataType); diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java index 624c3de650aa..86b162087f61 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -1390,6 +1390,21 @@ public class AppStandbyControllerTests { } @Test + public void testRestrictApp_MainReason() throws Exception { + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, + REASON_MAIN_DEFAULT); + mInjector.mElapsedRealtime += 4 * RESTRICTED_THRESHOLD; + + mController.restrictApp(PACKAGE_1, USER_ID, REASON_MAIN_PREDICTED, 0); + // Call should be ignored. + assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController, PACKAGE_1)); + + mController.restrictApp(PACKAGE_1, USER_ID, REASON_MAIN_FORCED_BY_USER, 0); + // Call should go through + assertEquals(STANDBY_BUCKET_RESTRICTED, getStandbyBucket(mController, PACKAGE_1)); + } + + @Test public void testAddActiveDeviceAdmin() throws Exception { assertActiveAdmins(USER_ID, (String[]) null); assertActiveAdmins(USER_ID2, (String[]) null); diff --git a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java index 6c722499da4b..bb9e24fa6813 100644 --- a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java +++ b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java @@ -198,11 +198,6 @@ public class StubTransaction extends SurfaceControl.Transaction { } @Override - public SurfaceControl.Transaction setEarlyWakeup() { - return this; - } - - @Override public SurfaceControl.Transaction setMetadata(SurfaceControl sc, int key, int data) { return this; } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 994f7c228165..0b31999dcb7e 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -275,6 +275,7 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.connectivity.resources.R; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnProfile; import com.android.internal.util.ArrayUtils; @@ -1574,6 +1575,14 @@ public class ConnectivityServiceTest { doReturn(com.android.connectivity.resources.R.array.config_networkSupportedKeepaliveCount) .when(mResources).getIdentifier(eq("config_networkSupportedKeepaliveCount"), eq("array"), any()); + doReturn(com.android.connectivity.resources.R.array.network_switch_type_name) + .when(mResources).getIdentifier(eq("network_switch_type_name"), + eq("array"), any()); + + // We don't test the actual notification value strings, so just return an empty array. + // It doesn't matter what the values are as long as it's not null. + doReturn(new String[0]).when(mResources).getStringArray(R.array.network_switch_type_name); + final ConnectivityResources connRes = mock(ConnectivityResources.class); doReturn(mResources).when(connRes).get(); doReturn(connRes).when(deps).getResources(any()); diff --git a/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java b/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java index d01dc03f5fe1..dde77b00a73f 100644 --- a/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java +++ b/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java @@ -36,6 +36,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.net.ConnectivityResources; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.os.UserHandle; @@ -45,9 +46,10 @@ import android.util.DisplayMetrics; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.R; +import com.android.connectivity.resources.R; import com.android.server.connectivity.NetworkNotificationManager.NotificationType; +import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -134,12 +136,26 @@ public class NetworkNotificationManagerTest { when(mCtx.getSystemService(eq(Context.NOTIFICATION_SERVICE))) .thenReturn(mNotificationManager); when(mNetworkInfo.getExtraInfo()).thenReturn(TEST_EXTRA_INFO); + ConnectivityResources.setResourcesContextForTest(mCtx); when(mResources.getColor(anyInt(), any())).thenReturn(0xFF607D8B); when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics); + // Come up with some credible-looking transport names. The actual values do not matter. + String[] transportNames = new String[NetworkCapabilities.MAX_TRANSPORT + 1]; + for (int transport = 0; transport <= NetworkCapabilities.MAX_TRANSPORT; transport++) { + transportNames[transport] = NetworkCapabilities.transportNameOf(transport); + } + when(mResources.getStringArray(R.array.network_switch_type_name)) + .thenReturn(transportNames); + mManager = new NetworkNotificationManager(mCtx, mTelephonyManager); } + @After + public void tearDown() { + ConnectivityResources.setResourcesContextForTest(null); + } + private void verifyTitleByNetwork(final int id, final NetworkAgentInfo nai, final int title) { final String tag = NetworkNotificationManager.tagFor(id); mManager.showNotification(id, PRIVATE_DNS_BROKEN, nai, null, null, true); |